$(document).ready(function(){
var someVar = $("non_existing_element");
});
称为可变在浏览器控制台
> $("non_existing_element");
[]
BUT
> someVar
ReferenceError: someVar is not defined
为什么这样实现?如果拨打someVar
也返回[]
或至少这两个调用返回相同的东西不会更有意义?
$(document).ready(function(){
var someVar = $("non_existing_element");
});
称为可变在浏览器控制台
> $("non_existing_element");
[]
BUT
> someVar
ReferenceError: someVar is not defined
为什么这样实现?如果拨打someVar
也返回[]
或至少这两个调用返回相同的东西不会更有意义?
$(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中发生。
道德故事:范围变量。了解你的变数。爱你的变数。
的评论技术上说:“在这一点上,有些变种,事实上平等[]“是错误的,因为它没有。它是一个包含空集的jQuery对象,甚至不保证它会在每个浏览器的控制台中显示为“[]”。 –
@AnthonyGrist我的回答是针对提问的人。所以,他告诉我他看到'someVar'被定义为'[]',那么我会根据这个来回答。 –
我知道你的答案中提到的所有概念(除了术语* scope leak *之外)。不过谢谢你。有一次,我在文档内部准备好了一些变量,但我可以在控制台中调用它(回头看,这一定是在其他地方定义的)。然后我得出结论,它是在jQuery代码中编写的,当'$'符号应用于文档并使用'ready'方法调用时,它会自动将此函数中的所有变量(而不是深层嵌套函数中的变量)转换为全球范围。我认为这是为了方便。 – Bentley4
因为'someVar'只存在于'document ready'范围内,因为你将它声明为'var someVar'?尝试使用'someVar = $(“non_existing_element”);' – RRikesh
您的'someVar'变量的作用范围是传递给'ready()'函数的匿名函数,因此控制台不可见。它是这样实现的,所以JavaScript实际上有一个变量范围的概念,而不是其他任何东西都可见的。 –
Downvoters请停止[跳到结论](http://en.wikipedia.org/wiki/Jumping_to_conclusions),并看看我对* Kyle Macey *的回答 – Bentley4