我正在努力(我相信是)一个范围问题。以下是我的代码示例:
$(document).ready(function() {
var counter = 0;
function scrollTweets() {
counter ++;
// rest of code
}
...
)}; // end of document ready
当我在Chrome的Javascript控制台中查找变量counter
时,它会返回“ReferencedError”。但是,当我从上面的代码中删除var
并在控制台中键入counter
时,它会返回该值。这是为什么?
我认为理解这个简单的概念可以让我解决在开发过程中似乎突然出现的问题。这只是Chrome的一个范围问题吗?我不必要地将所有内容包装在$(document).ready
“函数中”吗?
答案 0 :(得分:7)
var
将变量counter
锁定到任何词法范围 - 这意味着它在当前块,方法中可用,并且可以附加到封闭范围(即。闭包),就像你在使用scrollTweets
一样。所以counter
只能在ready
回调和任何有关闭的回调中使用,这就是您无法从控制台访问它的原因。
当您离开var
时,counter
实际上是全局的,这就是为什么您可以在这种情况下访问它。
答案 1 :(得分:5)
如果不使用var
设置变量的范围,它将自动成为全局范围内的全局变量。这就是Chrome控制台中可见的原因。
作为一个说明,我绝不暗示你应该将变量设为全局变量。事实上,这几乎总是一个坏主意!在使用它的范围的上下文中捕获变量是正确的做法。如果Chrome控制台无法处理,您只需要一个更好的调试器。用于Javascript的Firebug在处理范围方面做得非常出色 - 甚至是clojures!