2013-10-28 59 views
-5
$(document).ready(function(){ 
    var someVar = $("non_existing_element"); 
}); 

称为可变在浏览器控制台

> $("non_existing_element"); 
[] 

BUT

> someVar 
ReferenceError: someVar is not defined 

为什么这样实现?如果拨打someVar也返回[]或至少这两个调用返回相同的东西不会更有意义?

+0

因为'someVar'只存在于'document ready'范围内,因为你将它声明为'var someVar'?尝试使用'someVar = $(“non_existing_element”);' – RRikesh

+3

您的'someVar'变量的作用范围是传递给'ready()'函数的匿名函数,因此控制台不可见。它是这样实现的,所以JavaScript实际上有一个变量范围的概念,而不是其他任何东西都可见的。 –

+0

Downvoters请停止[跳到结论](http://en.wikipedia.org/wiki/Jumping_to_conclusions),并看看我对* Kyle Macey *的回答 – Bentley4

回答

1

90关于变量范围

$(document).ready(function(){ 
    var someVar = $("non_existing_element"); 
}); 

此时秒,someVar确实,实际上等于[]。所以,如果你写:

$(document).ready(function(){ 
    var someVar = $("non_existing_element"); 
    console.log("the value of someVar is", someVar); 
}); 

你会在控制台

看到someVar的值是[]

万岁!

但是!

只要你通过这最后花括号...

$(document).ready(function(){ 
    var someVar = $("non_existing_element"); 
}); // <<<<< This one 

你必须留下的function() {}定义的函数。注意,它没有名字,所以这叫做匿名函数。别担心,它不会对政治或经济产生反感。

一旦离开该功能,用var定义的变量将不再可用。这是为了防止范围泄漏,这是一个完整的其他对话,我相信你很快就会知道。尝试定义它没有var。走着瞧吧。

不使用var将允许该变量逃离猥琐的匿名函数的离合器,并将其本身放在全局范围内。 (其中,顺便可以访问通过window.global_variable

所以,当你输入一个变量到您的控制台(如果你使用breakpoints不适用),变量从全球范围看,既然你不是里面有的任何功能。由于我们发现var将变量作用于你不在的函数,我们现在知道它为什么没有定义。

我的意思是,想象一下,如果只能有一个名为checkbox的变量!你放入的每个Javascript插件都会相互冲突。没有人会知道checkbox是什么,在你知道它之前,疯狂的东西正在你的DOM中发生。

道德故事:范围变量。了解你的变数。爱你的变数。

+1

的评论技术上说:“在这一点上,有些变种,事实上平等[]“是错误的,因为它没有。它是一个包含空集的jQuery对象,甚至不保证它会在每个浏览器的控制台中显示为“[]”。 –

+0

@AnthonyGrist我的回答是针对提问的人。所以,他告诉我他看到'someVar'被定义为'[]',那么我会根据这个来回答。 –

+0

我知道你的答案中提到的所有概念(除了术语* scope leak *之外)。不过谢谢你。有一次,我在文档内部准备好了一些变量,但我可以在控制台中调用它(回头看,这一定是在其他地方定义的)。然后我得出结论,它是在jQuery代码中编写的,当'$'符号应用于文档并使用'ready'方法调用时,它会自动将此函数中的所有变量(而不是深层嵌套函数中的变量)转换为全球范围。我认为这是为了方便。 – Bentley4