Путаница в типе JSLint: функция и объект с помощью jQuery .css () - PullRequest
1 голос
/ 23 июня 2011

У меня проблемы с получением этих строк для проверки с использованием JSLint.Я предполагаю (возможно, неправильно), что они действительно действительны.Вот соответствующий код:

var shadowBox = $('<div/>').appendTo($(document.body));

// ...

shadowBox.css({
    left: (e.originalEvent.clientX + 10).toString() + 'px',
    top: e.originalEvent.clientY.toString() + 'px' 
});

Ошибки проверки, которые я получаю:

Проблема в строке 492 символа 22: Тип смущения: функция и .css: объект.

shadowBox.css ({

и

Проблема в строке 494, символ 57: Введите путаницу: число и '+': строка.

top: e.originalEvent.clientY.toString () + 'px'

Первый вопрос меня беспокоит, так как это довольно распространенный синтаксис jQuery. Второй выглядит какложное срабатывание, так как я объединяю строку со строкой.

Спасибо

РЕДАКТИРОВАТЬ

Разобрался с проблемой:

Получается JSLintнедовольны этими двумя синтаксическими шаблонами, существующими в одном документе:

var $var = $('<div/>', {css: {width: '15px'}}); // ONE
$var.css({width : '20px'}); // TWO

Ответы [ 3 ]

3 голосов
/ 23 июня 2011

из jslint : Тип путаницы

JSLint может делать вывод типа. Он может сообщать о случаях, когда переменные и свойства используются для размещения нескольких типов. Предупреждение о путанице типов: {a} и {b}. где {a} и {b} будут заменены именами типов.

Обычно легко увидеть, что вызвало предупреждение. В некоторых случаях это может быть очень загадочным. В загадочных случаях попробуйте инициализировать ваши переменные с введенными значениями. Например, если вы ожидаете, что n будет содержать числа, напишите

var n = 0;

Это должно дать более четкие предупреждения.

Путаница с типами не обязательно является ошибкой , особенно в языке, который обеспечивает такую ​​же свободу типов, как и этот. Но некоторые несоответствия являются ошибками, поэтому дисциплина типов может быть чем-то, что стоит добавить в ваш стиль программирования Кроме того, самые быстрые движки JavaScript будут замедляться при наличии путаницы типов. Чтобы отключить эти предупреждения, включите параметр Допуск типа путаница .

var shadowBox = $('<div/>').appendTo($(document.body));

// ...

$(shadowBox).css({
    left: String.concat(e.originalEvent.clientX + 10).toString(), 'px'),
    top: String.concat(e.originalEvent.clientY.toString(), 'px') 
});

Для второй ошибки вы можете использовать string.concat (e.originalEvent.clientY.toString (), 'px') или просто проигнорировать ошибку. jslint - это инструмент для обнаружения плохих практик, но он далеко не идеальный инструмент.

Кстати, есть валидатор js лучше, чем jslint: jshint . Это не имеет правил, которые господин. Крокфорду нравится, у него есть правила для лучшего JavaScript.

2 голосов
/ 24 июня 2011

Оказывается, что JSLint увеличил свои правила "путаницы типов".

Тогда как я думал, что путаница типов была определена просто так:

var a = 1;
var b = a + 'string';

Оказывается, мистер Крокфорд также считает это путаницей (я не особо с ним согласен)

function MyObject () {
    this.top() {
        return '15px';
    }
}

var anonObject = {top: '15px'};
var myObject = new MyObject();
var testString = myObject.top();

или гораздо более простой пример в контексте jQuery

var $b = $('<div/>').css({top: '15px'}),
    a = $b.offset().top + 15;

У меня сложилось впечатление, что путаница типов относится исключительно к идентификаторам, меняющим значение в области видимости. Хотя мистер Кроуфорд, кажется, думает:

От: Дуглас Крокфорд

Тема: Re: Проблемы с типом JSLint

Кому: «Энтони С.»

Дата: четверг, 23 июня 2011 г., 11:44

Вы, похоже, не понимаете, что такое смешение типов. Если вы этого не сделаете хотите увидеть предупреждения, тогда вам не нужно.

0 голосов
/ 23 июня 2011

Что касается первого, действительно ли shadowBox.css является функцией? Вы называете это так, как будто это так. EDIT : Да, поскольку это обычный объект jQuery, вы правильно используете .css. / EDIT

Что касается второго, мне это кажется действительным, хотя ты не даешь никакого контекста.

Обратите внимание, что jslint не очень хорошо понимает действительный JS, и я всегда рекомендую его не использовать.

...