使用var在Javascript中声明变量

pru*_*ett 3 javascript jquery scope

我正在努力(我相信是)一个范围问题.这是我的代码示例:

$(document).ready(function() {

var counter = 0;

function scrollTweets() {
    counter ++;
    // rest of code
}

...

)}; // end of document ready
Run Code Online (Sandbox Code Playgroud)

当我counter在Chrome的Javascript控制台中查找变量时,它返回"ReferencedError".但是,当我var从上面的代码中删除并键入counter控制台时,它返回值.为什么是这样?

我认为理解这个简单的概念将使我能够解决在开发过程中似乎突然出现的问题.这只是Chrome的一个范围问题吗?我不必要地将所有内容包装在$(document).ready"功能"中吗?

hvg*_*des 7

var变量锁定counter到任何词法范围 - 这意味着它在当前块,方法中可用,并且可以附加到封闭范围(即闭包),就像您正在使用的那样scrollTweets.所以counter只有ready回调和任何有关闭它的东西才能使用,这就是你无法从控制台访问它的原因.

当你var离开时,counter实际上是全局的,这就是为什么你可以在这种情况下访问它.


Mik*_*scu 5

如果不使用var设置变量的范围,它将自动成为全局范围内的全局变量.这就是Chrome控制台中可见的原因.

作为一个说明,我绝不暗示你应该使变量全局化.事实上,这几乎总是一个坏主意!在使用它的范围的上下文中捕获变量是正确的做法.如果Chrome控制台无法处理,您只需要一个更好的调试器.用于Javascript的Firebug在处理范围方面做得非常出色 - 甚至是clojures!