JavaScript中的每个函数都有一个变量?
我一直在使用JSLint让我对我的JavaScript感觉不好。 顺便说一句,这很棒。 有一张支票我不太明白,我希望你的意见。
来自jslint.com:
在具有块范围的语言中,通常建议在首次使用的站点声明变量。 但是因为JavaScript没有块范围,所以在函数顶部声明一个函数的所有变量是明智的。 建议每个函数使用一个var语句。
大胆的最后一个表态是什么? 我想我应该像这样声明多个变量?
var foo = 1, bar = 2;
而且,“明智的”部分只是一种编程风格,可以阻止错误发生,或者还有更多的不足呢?
谢谢你的帮助。
问题在于,无论您是否意识到,JavaScript都会无形地将所有var声明移至函数作用域的顶部。
所以如果你有这样的功能
var i = 5;
function testvar () {
alert(i);
var i=3;
}
testvar();
警报窗口将包含未定义的。 因为在内部,它已经变成这样:
var i = 5;
function testvar () {
var i;
alert(i);
i=3;
}
testvar();
这被称为“提升”。 crockford如此强烈地支持var声明的原因在于,它使得代码明显地匹配它将要做的事情,而不是让不可见和意外的行为发生。
基本上,在JavaScript块( { ... }
)中不会引入新的作用域,因此只有函数作用域,因此在任何其他语句上都不会创建作用域。
在函数的任何位置引入的变量在函数的任何地方都是可见的。
例如:
function myFunction(){
var one = 1;
if (one){
var two = one + 1;
}
(function () {
var three = one + two;
})();
// at this point both variables *one* and *two* are accessible but
// the variable *three* was declared in the scope of a inner function
// and is not accessible at this point.
}
在具有块范围的语言中,它建议在首次使用时声明变量,但由于JavaScript没有块范围,因此最好在函数的顶部声明所有函数的变量。
检查这篇文章。
块范围的缺乏解释了下面的代码:
var a = 1;
if (something) {
var a = 2;
}
alert(a); // Alerts "2"
在大多数C语言(与语法相同)的语言中, var a = 2
定义只会为if
块的范围定义'a'。 在函数顶部使用单个var语句有助于避免Javascript的这种怪异现象,这种情况并不总是像上面那样明显,而且对于C / C#/ Java程序员来说是意想不到的。
上一篇: One var per function in JavaScript?
下一篇: How to execute a JavaScript function when I have its name as a string