鉴于以下脚本,我预计第一次打开对话框时,var2
将在open
回调后立即取消定义,但第二次将其设置为123.不是这样的它总是未定义的。为什么呢?
然后我取消注释var2=111;
没有变化??? JavaScript不能线性执行吗?显然不完全,因为它以某种方式“知道”在此回调中本地定义var2
。我能正确地解释这个吗?
然后我将var var2 = 123;
更改为var2 = 123;
,所有内容都按预期工作。
http://jsfiddle.net/q9904tzn/1/
var var1=321;
// var2=111;
var dialog = $('#dialog').dialog({
autoOpen: false,
open: function (event, ui) {
console.log(var1, var2);
var var2 = 123;
},
});
$('#open').click(function () {
dialog.dialog('open');
});
<div id="dialog"></div>
<button id="open">Open</button>
答案 0 :(得分:1)
你小提琴中的代码几乎等于下面的代码:
var var1=321;
var dialog = $('#dialog').dialog({
autoOpen: false,
open: function (event, ui) {
var var2; // variable-hoisting
console.log(var1, var2);
var2 = 123; //gets initialized only here
},
});
$('#open').click(function () {
dialog.dialog('open');
});
正如您所看到的,变量var2
被提升到函数体的顶部,在技术上是undefined
,在您记录它的下一行。您在记录后为其分配了一个值。在记录之前分配它时,请尝试查看它将记录的内容。你会得到正确的价值。
由于你在open
函数中声明变量,变量不会持久存在,并且每次执行时都会重新声明给你相同的结果。