JSlint:在函数范围内重新定义i

时间:2014-04-25 19:21:37

标签: javascript jslint

通过JSLint运行以下Javascript代码时:

    (function () {
        var i = 'a';

        console.log(i);

        function foo () {
            var i = 'b';
            console.log(i);
        }

        foo();

        console.log(i);

        foo();
    }());

我在JSLint中遇到以下错误:

    #1 Redefinition of 'i' from line 4.
       var i = 'b'; // Line 7, Pos 13
    #2 Unused 'i'.
       var i = 'a'; // Line 4, Pos 9
    #3 Unused 'foo'.
        function foo () { // Line 6, Pos 14

我的问题:

  1. 为什么当我清楚地说它时,foo()是否未被使用?

  2. 为什么说功能范围var i = 'b'是对其上方的重新定义

  3. 为什么说第一个var i = 'a'定义未使用?

2 个答案:

答案 0 :(得分:2)

您正在重新定义i,因为它存在于两个范围内。

这本身并不是一个问题,但是Crockford认为这可能会引起混淆,因此他的工具会抓住它。

答案 1 :(得分:1)

首先,如果您在jslint.com上运行代码,则只会获得重定义错误,该错误有效。所以我不确定你为什么会看到错误1&你好吗?它在另一个应用程序中?您使用的是jslint.js的日期?等等

/*jslint sloppy:true, white:true, browser:true, devel:true */
(function () {
    var i = 'a';

    console.log(i);

    function foo () {
        var i = 'b';
        console.log(i);
    }

    foo();

    console.log(i);

    foo();
}());

这只给了我......

Redefinition of 'i' from line 3.
            var i = 'b';

足够公平。在您的问题评论中,来自牧师的相同优惠。正如杰里米所说,代码不会破裂。这只是令人困惑。为什么j中使用foo(当然还有实时代码中的描述性var名称)或者在each中使用的匿名函数}}?

当您使用JSLint时,请务必记住Crockford believes,"在使用难以与明显错误区分的习语时,很难编写正确的程序。&# 34;使用i内部foo覆盖您的外部i令人困惑。

想象一下如果foo读了......

    function foo () {
        console.log("Maybe I think I'm getting old 'i' here: " + i);

        var i = 'b';
        console.log(i);
    }

JSLint(奇怪的是,如果你问我)并不要求var语句是每个范围中的第一行,只是它在你引用变量之前发生。

因此,如果您使用新的foo运行测试代码,那么在您点击声明声明之前,您将foo i未定义b / c。可变吊装。奇怪,对吧? (或预期,取决于您的JS经验!)

a
Maybe I think I'm getting old 'i' here: undefined
b
a
Maybe I think I'm getting old 'i' here: undefined
b 

你可能会认为JSLint错了 - 它应该不仅抱怨Redefinition,而且还应该在'i' was used before it was defined.'}内抱怨foo。范围。我不肯认为。 ; ^)

然而,我会说,重新定义是一个难以区分明显错误的习语。最佳实践?不要在重叠范围内为不同的值重用变量名称。