javascript - 在回调中保留变量范围

标签 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>

最佳答案

你的 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 被提升到函数体的顶部,并且在您记录它的下一行中从技术上讲是未定义的。您在登录后为其分配一个值。在记录之前尝试看看当您分配它时它会记录什么。您将获得正确的值。

由于您是在 open 函数中声明变量,因此该变量不会持续存在,并且会在每次执行时重新声明,从而为您提供相同的结果。

关于javascript - 在回调中保留变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32698159/

相关文章:

javascript - npm install 是否也构建库?

循环内的 Java 变量

Python 多处理附加列表

json - js RegEx : Remove callback function call, 但保留参数(JSON)

php - PHP 回调可以通过引用接受它的参数吗?

javascript - 如何提供 Google map 实例的屏幕截图?

javascript - AngularJs Controller 中的实时时钟功能

javascript - 为什么这是一个永无休止的循环?

java : "error: cannot find symbol"

android-fragments - 当您想在 android studio 3.6.3 中创建新片段时,复选框 "include interface callbacks"在哪里