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.