在回调中保留变量范围

Perserving variable scope in callback

鉴于下面的脚本,我预计第一次打开对话框时,var2 会在 open 回调后立即未定义,但第二次它会被设置为 123。不是这种情况,它总是未定义的。为什么?

然后我取消注释var2=111;没有变化??? JavaScript不是线性执行的吗?显然不完全是因为它不知何故 "knew" 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>

您的 fiddle 中的代码几乎等于以下代码:

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 函数内声明变量,因此该变量不会持续存在,并且会在每次执行时重新声明给您相同的结果。