通过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
我的问题:
为什么当我清楚地说它时,foo()是否未被使用?
为什么说功能范围var i = 'b'
是对其上方的重新定义
为什么说第一个var i = 'a'
定义未使用?
答案 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
。范围。我不肯认为。 ; ^)