JSLint - 声明变量的问题

时间:2011-09-09 06:05:36

标签: javascript 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';

5 个答案:

答案 0 :(得分:20)

javascript中唯一的范围是功能范围(大括号不提供范围),因此switch语句中的那些变量位于函数顶部hoisted

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;
    }
}

答案 1 :(得分:17)

“如果我遵循JSLint,我将定义可能永远不需要使用的变量。”

如果按照自己的方式执行并忽略JSLint,您仍然会定义可能永远不会使用的变量。

这样做的原因是JavaScript将函数内的所有var声明视为发生在函数顶部的,即使您认为您在某些条件中声明了变量逻辑,例如在特定的 case(或iffor或其他内容)中。这被称为“吊装”。然后,实际值将分配给您执行任务的代码中的变量。也就是说,“已提升”变量最初会得到一个未定义的值,然后在您拥有var a = "something";的代码中,将分配该值。

正如其他答案所说,你可以通过声明函数顶部的变量(逗号用单个var语句分隔)来获取代码来传递JSLint,然后在任何点分配值你喜欢。

答案 2 :(得分:3)

要避免此JSLint错误,您可以

  1. 一起定义所有变量

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

  2. 使用JSLint指令Tolerate many var statements per function

答案 3 :(得分:2)

原因是JavaScript没有块范围;它只有全局和本地人。 JSLint并不关心在任何地方声明的全局变量,但对于 local 变量,故事情况则不同。这是因为在函数中间任何地方声明的局部变量实际上在函数内部无处不在

您应该将var a, b, c放在该函数的顶部,然后在您的switch语句中分配给它们。

关于定义可能永远不会使用的变量的问题,这在JavaScript中并不是真正的问题。在某种程度上,您实际上只是声明,而不是定义。只需编写var a, b, c;即可使三个变量存在,其值为undefined。事实上,你编写代码的方式,你会得到同样的效果!您在函数中间使用var定义的任何局部变量都是隐式声明的,并且无论如何都会在函数体的顶部设置为undefined。许多人认为这是一个很好的编程实践,可以使这个声明明确。

答案 4 :(得分:0)

使用vars option悄悄地允许var

的使用