JSLint - проблемы с объявлением переменных
Следующий код передает JSLint:
var sGreeting = 'hello world';
switch (sGreeting)
{
case 'Hello world!':
var a = 'some a value';
break;
case 'Kamusta mundo!':
var b = 'some b value';
break;
case 'Salut le Monde!':
var c = 'some c value';
break;
default:
break;
}
Однако, как только я поместил этот код в функцию, JSLint жалуется, что я должен Combine ... with the previous 'var' statement.
Если я буду следовать JSLint, я бы определял переменные, которые, возможно, никогда не понадобится использовать. Как мне решить эту проблему? Вот код, за которым следуют ошибки JSLint:
function foo()
{
'use strict';
var sGreeting = 'hello world';
switch (sGreeting)
{
case 'Hello world!':
var a = 'some a value';
break;
case 'Kamusta mundo!':
var b = 'some b value';
break;
case 'Salut le Monde!':
var c = 'some c value';
break;
default:
break;
}
}
Error:
Problem at line 9 character 7: Combine this with the previous 'var' statement.
var a = 'some a value';
Problem at line 12 character 7: Combine this with the previous 'var' statement.
var b = 'some b value';
Problem at line 15 character 7: Combine this with the previous 'var' statement.
var c = 'some c value';
Ответы
Ответ 1
Единственная область действия в javascript - это функциональная область (фигурные скобки не предоставляют область), поэтому эти vars в выражении switch подняты вверху функции.
Что предлагает jslint:
function foo() {
'use strict';
var a, b, c, sGreeting;
sGreeting = 'hello world';
switch (sGreeting) {
case 'Hello world!':
a = 'some a value';
break;
case 'Kamusta mundo!':
b = 'some b value';
break;
case 'Salut le Monde!':
c = 'some c value';
break;
default:
break;
}
}
Ответ 2
"Если я последую за JSLint, я буду определять переменные, которые, возможно, никогда не будут использоваться".
Если вы сделаете это по-своему и проигнорируете JSLint, вы все равно будете определять переменные, которые никогда не будут использоваться.
Причиной этого является то, что JavaScript обрабатывает все объявления var
внутри функции, как если бы они находились в верхней части функции, даже если вы считали, что объявляете переменную (-и) внутри некоторой условной логики, например внутри специфический case
(или if
или for
или что-то еще). Это называется "подъем". Фактические значения затем присваиваются переменным в точке кода, в котором вы выполняли свое задание. То есть, "поднятые" переменные сначала получают значение undefined, а затем в точке кода, где у вас есть var a = "something";
, значение будет назначено.
Итак, как и другие ответы, вы можете получить свой код для передачи JSLint, объявив переменные в верхней части функции (запятая, разделенная с одним оператором var
), а затем назначьте значения в любой точке, которая вам нравится.
Ответ 3
Чтобы избежать ошибок JSLint, вы можете
-
Определить все переменные вместе
var sGreeting = 'hello world', a, b, c;
-
Используйте директиву JSLint Tolerate many var statements per function
Ответ 4
Причина этого в том, что JavaScript не имеет области блока; он имеет только глобальные и локальные жители. JSLint не заботится о том, чтобы глобальные переменные объявлялись где угодно, но для локальных переменных история отличается. Это связано с тем, что локальная переменная, объявленная где угодно в середине функции, фактически доступна внутри функции.
Вы должны разместить var a, b, c
в верхней части функции, а затем назначить их в своем операторе switch.
Что касается вашей проблемы с определением переменных, которые никогда не будут использоваться, это не проблема в JavaScript. В некотором смысле вы действительно заявляете, а не определяете. Просто запись var a, b, c;
приводит к появлению трех переменных со значением undefined
. На самом деле, как вы написали свой код, вы получаете тот же эффект! Любая локальная переменная, которую вы определяете с помощью var
в середине функции, объявляется неявно и устанавливается в undefined
в верхней части тела функции в любом случае. Многие считают хорошей практикой программирования, чтобы сделать это выражение явным.
Ответ 5
Используйте параметр vars
, чтобы спокойно разрешить это использование var
.