JSLint - 声明变量的问题

Sta*_*bie 11 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;
}
Run Code Online (Sandbox Code Playgroud)

但是,一旦我将该代码放入函数中,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';
Run Code Online (Sandbox Code Playgroud)

ste*_*eax 20

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


nnn*_*nnn 17

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

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

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

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