我在学习jQuery和Javascript时发现了一种奇怪的行为。当我调用在$(document).ready中定义的变量时,从这些标记外部它看起来是未定义的,即使我将它定义为全局变量, 例如:
$(document).ready(function() {
myVar = "test";
});
alert(typeof(myVar));
//Results "undefined"
如果我在document.ready标记内调用相同的变量,它按预期工作
$(document).ready(function() {
myVar = "test";
alert(typeof(myVar));
//Results "String"
});
使用窗口前缀后结果相同。
$(document).ready(function() {
window.myVar = "test";
});
alert(typeof(window.myVar));
//Results "undefined"
我理解变量范围但是为什么即使全局变量也不是这样工作的。我很困惑。
答案 0 :(得分:3)
"准备好"内的代码在完全构建DOM之前,处理程序不会运行。代码外部处理程序将在遇到时立即运行。因此,您的alert()
在处理程序中的代码运行之前运行,因此结果非常有意义:全局变量尚未初始化,因此其值为undefined
。
通过将alert()
(或更好的console.log()
)来电置于" ready"内,您可以清楚地看到执行顺序。处理程序:
$(document).ready(function() {
console.log("In the 'ready' handler");
});
console.log("Outside the 'ready' handler");
当它运行时,你会看到"外部"消息首先。
答案 1 :(得分:1)
因为alert()
是在文档完全准备好之前执行的..你甚至可以尝试在$(document).ready()
之前声明变量,它仍然会返回undefined ..
答案 2 :(得分:0)
$(文档).ready()在页面完全加载后被触发
当脚本标记完全加载时,警报将被执行。
所以
在设置var之前执行警报
答案 3 :(得分:0)
其他答案是正确的,但同样重要的是还要注意$(document).ready(...)
也将变量隐藏在全局范围内。您可以声明您的变量,然后在函数
var myVar;
$(document).ready(function() {
myVar = "test";
});
console.log(myVar) // test
答案 4 :(得分:0)
执行计划就像
//this statement shall fix the driver, not run it
$(document).ready(function() {//-->this it's an event handler waiting to be fired when content is fully loaded
myVar = "test";//-->myVar won't exists until this event is triggered
});
//this execute the alert function but myVar not exist yet
alert(typeof(myVar));
$(document).ready()就像分配一个在内容加载后会执行的事件,这意味着警告(myVar)将在之前运行lambda执行被设置为内容加载的事件。我希望你能理解我。