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