我正在从嵌套函数的外部作用域更新变量,
由于这是在 init 函数期间发生的,因此外部作用域不是最外层(窗口)作用域;
var init = function() {
var x = 'old stuff' ;
function butClick() {
x = 'new stuff' ;
}
console.log(x); // new stuff
document.querySelector("btn").addEventListener("click", butClick, false);
}
window.addEventListener( 'DOMContentLoaded', init, false);
为了将其保存在 init-function 作用域中,我省略了 var 关键字,并且正如预期的那样,变量的新值会冒泡并更新;
但是 console.log('x' in window )
的结果是 false,
冒泡不应该到达窗口范围吗?
最佳答案
x
在您的 init
函数中声明,因此该函数(或其中的任何内容)内的 x
不会解析为一个全局性的。
另外,在您的问题代码中添加注释:
console.log(x) // new stuff
...暗示 x
届时将是“新东西”。不会的。您没有在任何地方调用 butClick
,因此 x
将具有其原始的“旧内容”值。
如果您在某个时刻确实调用了butClick
,它会更新init
本地的x
。它不会创建或更新全局。
将更新设置 butClick
作为事件处理程序:建议 x
应该是“新东西”的评论仍然是错误的。截至 console.log
行运行时,x
的值为“old stuff”。 稍后,如果有人点击该按钮,x
将由 butClick
更新,但这不会追溯重新-运行 console.log
行。
但即使在响应点击时调用,butClick
仍在更新 init
中的 x
,而不是全局的。变量范围是按词法确定的,而不是由调用函数的位置来自确定。
关于javascript - 冒泡范围 - 从嵌套函数更新 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28213200/