2009-05-01 2 views
63

JSLint (с onevar флага включен) ослабевают некоторый яваскрипта кода, который я имею в следующем:Что является причиной JSLint говоря есть «слишком много вара заявления»

Problem at line 5 character 15: Too many var statements.

Я счастлив исправить эти ошибки, но я хотел бы знать, я делаю это для производительности или потому, что это просто плохая практика и имеет больший потенциал для введения ошибок в код javascript. В чем причина флага onevar?

Я просмотрел документы JSLint для var keyword, но в нем конкретно не говорится о том, почему несколько операторов var в одной и той же функции являются плохими.

Простейший пример. Объясните, как код будет пользоваться только имея 1 уаг заявление:

function Test(arg) { 
    var x = arg + 1, 
     y = cache.GetItem('xyz'); 
    if (y !== null) { 
     // This is what would cause the warning in JSLint 
     var request = ajaxPost(/* Parameters here */); 

    } 
} 
+0

Покажи нам сценарии! – alex

ответ

99

Javascript не имеет блокировки. На других языках с ним (например, c), если вы объявляете переменную в выражении if, вы не можете получить к ней доступ за ее пределами, но в javascript вы можете. Автор JSLint считает, что это плохая практика, так как вы (или другие читатели) можете запутаться и подумать, что больше не можете обращаться к переменной, но на самом деле можете. Поэтому вы должны объявить все свои переменные в верхней части функции.

+0

Лучший ответ, чем мой, modding. – tpdi

+7

Это отвечает на вопрос о том, почему нужно объявлять все 'VAR' в верхней части функции, но как насчет точки относительно «одного выражения VAR» и «нескольких операторов VAR» (все на Вверх)". Есть ли * хорошая причина для этого, или просто «это экономит печатание, так почему бы и нет»? –

+0

По умолчанию правила JSLint являются лишь показателями [david crockford] (http://www.jslint.com/help.html) о том, как сделать правильный и неправильный код визуально отличным. это его мнение * хорошая * причина? не знаю, но это по крайней мере * * причина. – worc

1

Просто угадать здесь, но это может быть время для functional decomposition. Функции должны делать один вещь и делать это хорошо.

Слишком много vars указывает на функцию, которая пытается сделать слишком много. Или случай, когда вы должны использовать массив.

+0

Не уверен, что я согласен с этим. В этом случае «слишком много» - это больше одного var. Чтобы обойти это, вы можете использовать запятые ('var x, y;'), но это трудно прочитать. Это довольно смешно, на мой взгляд, и продвигает трудно читаемый код. В настоящее время я работаю над проектом с большим количеством этого, и трудно понять, где объявляются переменные. –

3

Если для параметра «onevar» установлено значение «Истина», если допускается только один оператор var для каждой функции.

if (funct['(onevar)'] && option.onevar) { 
    warning("Too many var statements."); 
} 
+0

Хорошо, я уточнил в вопросе, что я специально включил это. Поэтому я знаю, почему это предупреждает меня, но что фиксирует эти предупреждения для моего кода? – slolife

-6

Идея состоит в том, что вы должны использовать объект вместо отдельных варов. Так, где у вас есть:

var x = arg + 1, 
    y = cache.GetItem('xyz'); 

Изменить это:

var dimensions = {}; 
dimensions.x = arg + 1; 
dimensons.y = cache.GetItem('xyz'); 
dimensions.request = ... 

Вы можете получить доступ к этим переменным с помощью объекта, его аккуратнее, чтобы иметь один объект на функцию, чтобы содержать, что функции переменных. Тогда вы не получите предупреждение.

6

Просто объявлять ВАР в одном месте, как это:

var request,x,y; 
29

Официальная причина is here, Дуглас Crockford.

процитировать:

Во многих языках, блок вводит сферу. Переменные, введенные в , не видны за пределами блока.

В JavaScript блоки не вводят область действия. Существует только функция-scope. Переменная, введенная где угодно в функции, равна , видимой всюду в функции. Блоки JavaScript путают опытных программистов и приводят к ошибкам, потому что знакомый синтаксис делает ложное обещание.

JSLint ожидает блоки с функцией, если, переключатель, while, for, do и пробовал заявления и нигде больше.

В языках с объемом блока обычно рекомендуется указывать переменные на месте первого использования. Но поскольку JavaScript не имеет области блока, разумнее объявить все переменные функции в верхней части функции. Для каждой функции рекомендуется использовать один оператор . Это может быть отклонено с помощью опции vars .

2

Обоснование уже описано.

Рекомендация использовать эту форму:

var myVar1 = document.getElementById("myDiv1"), 
    myVar2 = document.getElementById("myDiv2"); 

или это:

var myVar1, myVar2; 
myVar1 = document.getElementById("myDiv1"); 
myVar2 = document.getElementById("myDiv2"); 

Но это не выглядит очень красиво, особенно если вы хотите, чтобы документ ВАР.

Таким образом, вы можете просто отключить это предупреждение temporarly:

/*jslint vars: true*/ 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar1 = document.getElementById("myDiv1"); 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar2 = document.getElementById("myDiv2"); 
    /*jslint vars: false*/ 

Внимание: убедитесь, что это будет сделано в верхней части функции.

Я думаю, что это сделано, потому что jslint не может надежно определить, были ли объявлены vars в верхней части функции или нет.

Смежные вопросы