Jslint声称变量已经定义了?(1)

ple*_*unt 4 javascript jslint

function wrapper() {
    var $R = {};

    $R.expandFont = function (direction, max_time) {
        // wtf? $R jslint error
        var self = this,
            el_prim = self[0],
            $R = {};

        alert(direction + max_time + el_prim + $R);
    };
}
Run Code Online (Sandbox Code Playgroud)

此代码段会出错:

line 573 character 13
'$R' is already defined.
Run Code Online (Sandbox Code Playgroud)

我认为很明显它以前没有定义过.

$ R在外部范围内定义,但这不应该是相关的.我应该能够定义一个与JavaScript(语言)同名的局部变量是函数作用域.是的,我知道它不是块范围的,但它是功能范围的.

这是基本的范围规则.是什么赋予了?

这是一个jslint错误吗?

Jam*_*ice 6

这是JSLint中的一个新功能.它是在2013年7月24日的提交中添加的.以下示例演示了错误的原因:

(function () {
    var a = 1; // This declaration...
    return function () {
        var a = 2; // ... is shadowed by this one.
    };
}());
Run Code Online (Sandbox Code Playgroud)

似乎只有在JSLint遇到在函数作用域中声明的变量(不在全局作用域中)时才会发出警告,该变量稍后被遮蔽(这可以解释为什么你问题的评论者无法重现它).

看来目前无法关闭此警告.

Crockford 对此新警告有以下说法:

JSLint现在会在定义var时与外部作用域中的某个名称相同时发出警告.这很令人困惑,因为读者不能轻易分辨出他正在看哪个变量.它有时是一个错误,因为新变量意外地隐藏了旧变量.在某些情况下,旧的是预期的.

一旦我有机会,我会在http://jslinterrors.com上得到一个完整解释的页面.