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

此代码段给出错误:

line 573 character 13
'$R' is already defined.

我认为很明显它之前没有定义。

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

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

这是一个jslint错误吗?

4

4 回答 4

6

这是 JSLint 中的一个新特性。它是由2013 年 7 月 24 日的提交添加的。以下示例演示了错误的原因:

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

似乎只有当 JSLint 遇到在函数范围内(而不是在全局范围内)声明的变量时才发出警告,该变量后来被遮蔽(这可以解释为什么您的问题的评论者无法重现它)。

看来目前没有办法关闭此警告。

克罗克福德对这个新警告有以下说法:

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

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

于 2013-07-25T08:07:34.583 回答
2

我认为您自己了解,如果您$R在函数的外部或内部范围内重命名,JSLint“错误”将得到修复。

我决定写我的答案只是因为我认为对 JSLint 的目标存在误解。它不仅仅是一个从 JavaScript 语言的角度帮助您查找错误的工具。您可以将该工具视为JavaScript: The Good Parts书的插件。Douglas Crockford 试图表明阅读代码的人可能会误解该语言的哪些结构。一些来自潜在的误解他宣布为“警告”,另一些为“错误”。一些来自“警告”或“错误”的注释可以被其他注释所抑制(比如在 for-loop 标头内部/*jslint ... */声明)。var选择哪些潜在的误解应该被解释为“警告”非常主观,仅代表 Douglas Crockford 的个人意思。

我并不总是同意 Douglas Crockford 的建议,但警告(“错误”):'$R' is already defined由于难以阅读此类代码,我个人认为也很重要。我建议您也从$R变量中重命名一个。我想再强调一次,这些更改的目标不是修复 JavaScript 错误,而是提高程序对其他人的可读性

顺便说一句,我建议您仅在顶层使用所有大写字母的变量($R看起来如此,独立于第一个$字母)。请参阅JSLint 建议中关于命名约定的最后一句话。

于 2013-07-25T10:36:04.343 回答
1
line 573 character 13
'$R' is already defined

这是因为已经定义了 $R。两种选择:

更改变量名称

或将您的代码更改为:

var $R = {};

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

    $R = {};

另外,请参阅 DC 关于重新定义的这篇文章。

于 2013-07-24T21:43:09.970 回答
0

明显地,

$R造成混乱。给 jslint 语法分析器和 SO 的成员。当您从外部范围移动到内部范围时,请更改它。

$R到类似的东西$PR,或其他。

当您可以简单地更改变量名称时,没有必要引起这种混乱。

克罗克福德不是傻子。如果您选择遵循它们,这些都是很好的指导方针。

于 2013-07-24T21:31:39.767 回答