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

时间:2013-07-24 20:30:00

标签: 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);
    };
}

此代码段显示错误:

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

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

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

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

这是一个jslint错误吗?

4 个答案:

答案 0 :(得分:6)

这是JSLint中的一项新功能。它是在a commit于2013年7月24日添加的。以下示例演示了错误原因:

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

似乎警告仅在JSLint遇到在函数范围中声明的(不在全局范围内)中的变量时发出,该变量稍后被隐藏(这可以解释为什么您问题的评论者无法重现它。)

目前似乎无法关闭此警告。

Crockford对这个新警告有the following to say

  

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

一旦我有机会,我会在http://jslinterrors.com上完整地解释这一点。

答案 1 :(得分:2)

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

我决定写我的答案只是因为我认为对 JSLint 的目标存在误解。它不仅仅是一种帮助您从JavaScript语言的角度查找错误的工具。您可以将该工具视为书籍JavaScript: The Good Parts的AddOn。道格拉斯·克罗克福德(Douglas Crockford)试图展示该语言的哪些结构可能会被阅读代码的人误解。一些人从潜在的误解中宣称为“警告”,另一些则称为“错误”。一些来自“警告”或“错误”的内容可以通过/*jslint ... */之类的注释来抑制,而不是像for循环标头中的var声明一样。选择哪些潜在的误解应该被解释为“警告”,哪一个被误解为“错误”非常主观并且仅代表道格拉斯·克罗克福德的个人意义。

我并不总是同意道格拉斯·克罗克福德的建议,但警告(“错误”):'$R' is already defined我个人认为这也很重要,因为阅读此类代码有困难。我建议你也从$R变量重命名一个。我想再次强调,此类更改的目标不是修复JavaScript错误,而是提高程序对其他人的可读性

顺便提一下,我建议你只使用顶级的所有大写字母变量($R看起来如此,独立于第一个$字母)。请参阅the JSLint recommendation about the naming convention的最后一句。

答案 2 :(得分: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 redefinition上的这篇文章。

答案 3 :(得分:0)

显然,

$R导致混乱。到jslint语法分析器和SO的成员。当你从外部范围移动到内部范围时,改变它。

$R$PR或其他。

当您只需更改变量名称时,无需引起混淆。

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