В чем причина того, что JSLint говорит, что существует "слишком много операторов var",
JSLint (с включенным флагом onevar) помещает некоторый код javascript, который у меня есть со следующим:
Problem at line 5 character 15: Too many var statements.
Я рад исправить эти ошибки, но я хотел бы знать, делаю ли я это для производительности или потому, что это просто плохая практика и имеет больший потенциал для введения ошибок в код javascript. В чем причина флага onevar?
Я просмотрел документы JSLint для ключевое слово var, но в нем конкретно не говорится о том, почему несколько операторов var в одной и той же функции плохой.
Вот пример примера. Объясните, как код будет полезен только при наличии 1 инструкции var:
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 */);
}
}
Ответы
Ответ 1
Javascript не имеет области блока. На других языках с ним (например, c), если вы объявляете переменную в выражении if, вы не можете получить к ней доступ за ее пределами, но в javascript вы можете. Автор JSLint считает, что это плохая практика, так как вы (или другие читатели) можете запутаться и подумать, что больше не можете обращаться к переменной, но на самом деле можете. Поэтому вы должны объявить все свои переменные в верхней части функции.
Ответ 2
Официальная причина здесь, Дуглас Крокфорд.
Цитата:
Во многих языках блок вводит область видимости. Переменные, введенные в блок не отображается за пределами блока.
В JavaScript блоки не вводят область. Здесь есть только Функция-сфера. Переменная, введенная где угодно в функции, является видимый всюду в функции. Блоки JavaScript блокируют опытные программисты и приводят к ошибкам, потому что знакомый синтаксис делает ложное обещание.
JSLint ожидает блоки с функцией, if, switch, while, for, do и попробуйте утверждения и нигде больше.
В языках с областью блока обычно рекомендуется, чтобы переменные объявляются на месте первого использования. Но поскольку JavaScript не имеет области блока, разумнее объявить все функции переменные в верхней части функции. Рекомендуется, чтобы один var для каждой функции. Это может быть отклонено с помощью vars вариант.
Ответ 3
Просто объявляйте свои вары в одном месте:
var request,x,y;
Ответ 4
Если для параметра "onevar" установлено значение true, если разрешен только один оператор var для каждой функции.
if (funct['(onevar)'] && option.onevar) {
warning("Too many var statements.");
}
Ответ 5
Обоснование уже описано.
Рекомендация заключается в использовании этой формы:
var myVar1 = document.getElementById("myDiv1"),
myVar2 = document.getElementById("myDiv2");
или это:
var myVar1, myVar2;
myVar1 = document.getElementById("myDiv1");
myVar2 = document.getElementById("myDiv2");
Но это выглядит не очень хорошо, особенно если вы хотите документировать vars.
Итак, вы можете временно отключить это предупреждение:
/*jslint vars: true*/
/**
* @returns {HTMLDivElement}
*/
var myVar1 = document.getElementById("myDiv1");
/**
* @returns {HTMLDivElement}
*/
var myVar2 = document.getElementById("myDiv2");
/*jslint vars: false*/
Предупреждение: убедитесь, что это выполняется в верхней части функции.
Я думаю, что это сделано, потому что jslint не может надежно определить, были ли vars объявлены в верхней части функции или нет.
Ответ 6
Только предположение, но может быть время для функциональной декомпозиции. Функции должны делать одно и делать это хорошо.
Слишком много vars указывает на функцию, которая пытается сделать слишком много. Или случай, когда вы должны использовать массив.
Ответ 7
Идея состоит в том, что вы должны использовать объект вместо отдельных vars. Итак, где у вас есть:
var x = arg + 1,
y = cache.GetItem('xyz');
Измените его на:
var dimensions = {};
dimensions.x = arg + 1;
dimensons.y = cache.GetItem('xyz');
dimensions.request = ...
Затем вы можете получить доступ к этим переменным через объект, его опережающий, чтобы один объект на каждую функцию содержал эти переменные функций. Тогда вы не получите предупреждение.