JSLint - проблемы с объявлением переменных - PullRequest
11 голосов
/ 09 сентября 2011

Следующий код передает 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';

Ответы [ 5 ]

20 голосов
/ 09 сентября 2011

Единственная область видимости в javascript - это функциональная область (фигурные скобки не предоставляют область видимости), поэтому эти переменные в операторе 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;
    }
}
17 голосов
/ 09 сентября 2011

«Если я буду следовать JSLint, я буду определять переменные, которые, возможно, никогда не понадобятся.»

Если вы сделаете это по-своему и проигнорируете JSLint, вы все равно будете определять переменныеэто никогда не может быть использовано.

Причина этого в том, что JavaScript обрабатывает все объявления var внутри функции, как если бы они произошли в верхней части функции, , даже если вы думали, что объявляетепеременная (и) внутри некоторой условной логики, например, внутри определенной case (или if или for или чего-либо еще).Это называется «подъем».Фактические значения затем присваиваются переменным в той точке кода, в которой вы выполняли присваивание.То есть переменные «hoisted» сначала получают неопределенное значение, а затем в той точке кода, где у вас было var a = "something"; значение, будет присвоено.

Так что, как сказали другие ответы, вы можетеПолучите ваш код для передачи JSLint, объявив переменные в верхней части функции (запятую, разделенную одним оператором var), а затем присвойте значения в любой точке, которая вам нравится.

3 голосов
/ 09 сентября 2011

Чтобы избежать ошибок JSLint, вы можете

  1. Определить все переменные вместе

    var sGreeting = 'hello world', a, b, c;

  2. Использовать директиву JSLintTolerate many var statements per function

2 голосов
/ 09 сентября 2011

Причина этого в том, что JavaScript не имеет области видимости блока;у него есть только глобалы и местные жители.JSLint не заботится о том, чтобы глобальные переменные были объявлены где-либо, но для локальных переменных история другая.Это потому, что локальная переменная, объявленная где-то в середине функции, фактически доступна везде внутри функции.

Вы должны поместить var a, b, c в верхней части функции, а затем1008 * присвойте им в вашем операторе switch.

Что касается вашего беспокойства по поводу определения переменных, которые могут никогда не использоваться, то это не является проблемой в JavaScript.В некотором смысле вы действительно объявляете , а не определяете .Простое написание var a, b, c; приводит к появлению трех переменных со значением undefined.На самом деле, как вы написали свой код, вы получите тот же эффект!Любая локальная переменная, которую вы определяете с помощью var в середине функции, объявляется неявно и в любом случае устанавливается на undefined в верхней части тела функции.Многие считают хорошей практикой программирования делать это объявление явным.

0 голосов
/ 18 марта 2013

Используйте параметр vars , чтобы тихо разрешить это использование var.

...