为什么变量在文档就绪标记外部未定义

时间:2016-06-15 12:50:02

标签: javascript jquery variables scope

我在学习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"

我理解变量范围但是为什么即使全局变量也不是这样工作的。我很困惑。

5 个答案:

答案 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()在页面完全加载后被触发

当脚本标记完全加载时,警报将被执行。

所以

  1. 加载脚本标记=>执行警告
  2. 继续加载页面
  3. Page completly loaded => fire $(document).ready
  4. 你正在设置
  5. 在设置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执行被设置为内容加载的事件。我希望你能理解我。