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程序员来说是意想不到的。

链接地址: http://www.djcxy.com/p/2773.html

上一篇: One var per function in JavaScript?

下一篇: How to execute a JavaScript function when I have its name as a string