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错误吗?
答案 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
或其他。
当您只需更改变量名称时,无需引起混淆。
克罗克福德不是傻子。如果您选择遵循它们,这些都是很好的准则。