在回调中保持变量范围

时间:2015-09-21 14:44:57

标签: javascript variables callback namespaces closures

鉴于以下脚本,我预计第一次打开对话框时,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>

1 个答案:

答案 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函数中声明变量,变量不会持久存在,并且每次执行时都会重新声明给你相同的结果。