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

Javascript 为什么变量在文档就绪标记外显示为未定义,javascript,jquery,variables,scope,Javascript,Jquery,Variables,Scope,我在学习jQuery和Javascript时观察到一个奇怪的行为。当我调用$document.ready中定义的变量时,从这些标记外部看,它似乎未定义,即使我将其定义为全局变量, 例如: $(document).ready(function() { myVar = "test"; }); alert(typeof(myVar)); //Results "undefined" 如果我在document.ready标记中调用相同的变量,它将按预期工作 $(document).ready(fu

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

我理解变量的作用域,但为什么全局变量都不能这样工作。我很困惑。

在完全构建DOM之前,ready处理程序中的代码不会运行。处理程序外部的代码将在遇到它时立即运行。因此,您的警报在处理程序中的代码运行之前运行,因此结果非常合理:全局变量尚未初始化,因此其值未定义

通过在ready处理程序中放置alert或更好的console.log调用,您可以清楚地看到执行顺序:

$(document).ready(function() {
  console.log("In the 'ready' handler");
});
console.log("Outside the 'ready' handler");

运行时,您将首先看到记录的外部消息。

在完全构建DOM之前,ready处理程序中的代码不会运行。处理程序外部的代码将在遇到它时立即运行。因此,您的警报在处理程序中的代码运行之前运行,因此结果非常合理:全局变量尚未初始化,因此其值未定义

通过在ready处理程序中放置alert或更好的console.log调用,您可以清楚地看到执行顺序:

$(document).ready(function() {
  console.log("In the 'ready' handler");
});
console.log("Outside the 'ready' handler");

运行时,您将首先看到记录的外部消息。

,因为该警报是在文档完全就绪之前执行的。。您甚至可以在$document.ready之前声明变量,但它仍将返回未定义的..

,因为此警报是在您的文档完全就绪之前执行的。。您甚至可以在$document.ready之前声明变量,但它仍将返回未定义的。

页面完全加载后,将触发$document.ready

脚本标记完全加载后,将执行警报

所以

脚本标记已加载=>执行警报 继续加载页面 页面已完全加载=>fire$document.ready 你准备好了
在设置var之前执行警报

在页面完全加载后触发$document.ready

脚本标记完全加载后,将执行警报

所以

脚本标记已加载=>执行警报 继续加载页面 页面已完全加载=>fire$document.ready 你准备好了
在设置var之前执行警报

其他答案是正确的,但可能还需要注意$document。就绪。。。也在全局范围内隐藏变量。您可以声明变量,然后在函数中更新它

var myVar;

$(document).ready(function() {
    myVar = "test";
});

console.log(myVar)   // test

其他答案都是正确的,但也要注意$document。准备好了吗。。。也在全局范围内隐藏变量。您可以声明变量,然后在函数中更新它

var myVar;

$(document).ready(function() {
    myVar = "test";
});

console.log(myVar)   // test

执行计划就像

//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类似于分配一个将在加载内容后执行的事件,这意味着alertmyVar将在lambda执行之前运行,lambda执行被设置为加载内容的事件。我希望你能理解我。

执行计划是这样的

//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类似于分配一个将在加载内容后执行的事件,这意味着alertmyVar将在lambda执行之前运行,lambda执行被设置为加载内容的事件。我希望你能理解我。

查看后检查后完善的解释!完美的解释!否,因为该变量在函数中引用时没有var声明。是的,你是对的,我一直在阅读有关范围的内容,并在没有充分思考的情况下直接回答了这个问题我假设我不能在fiddle中重新创建它的原因是因为JSFIDLE包装文档在执行任何代码之前已经准备好了?JSFIDLE中的默认设置是让您的代码在窗口加载处理程序中运行—它可以通过JavaScript选项进行控制。单击JavaScript面板右上角的小齿轮图标。否,因为函数中引用的变量没有var声明。是的,你是对的,我一直在阅读有关范围的内容,并在没有充分思考的情况下直接回答了这个问题我假设我不能在fiddle中重新创建它的原因是因为JSFIDLE包装文档在执行任何代码之前已经准备好了?JSFIDLE中的默认设置是让您的代码在窗口加载处理程序中运行—它可以通过JavaScript选项进行控制。单击JavaScript面板右上角的小齿轮图标。