2011-10-21 138 views
3

我正在努力(我相信是)范围问题。这里是我的代码示例:使用var在Javascript中声明变量

$(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“功能”中包装了所有内容?

+2

不要让它成为全球!如果你想检查'counter',那么在代码中设置一个断点。这将允许您检查各种关闭级别的变量的当前状态。或者只需使用'console.log()'记录该值。 – user113716

+0

谢谢@Ӫ_._Ӫ...这是一项很好的技术! – pruett

回答

7

var锁定可变counter成任何词汇范围是 - 这意味着其在当前块中可用的,方法,不管,并且可以连接到封闭在范围(即封闭。),如你正在做与scrollTweets。所以counter仅在ready回调以及任何周围有闭包的东西中可用,这就是为什么您无法从控制台访问它的原因。

当你将var带走时,counter实际上是全局性的,这就是为什么你可以在这种情况下访问它。

+0

感谢,非常有用的信息。 – pruett

5

当您不使用var来设置变量的作用域时,它会自动变成全局变量的全局变量。这就是它在Chrome控制台中可见的原因。

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

+0

谢谢!很有帮助。我会给萤火虫试一试 – pruett

+0

@pruett,为了避免混淆,Firebug仅适用于Firefox。但是因为它是一个非常强大的调试器,所以在使用FF作为您的调试浏览器时可能会值得。 –