Javascript 为什么变量在文档就绪标记外显示为未定义
我在学习jQuery和Javascript时观察到一个奇怪的行为。当我调用$document.ready中定义的变量时,从这些标记外部看,它似乎未定义,即使我将其定义为全局变量, 例如: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
$(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面板右上角的小齿轮图标。