冒泡范围 - 从嵌套函数更新 var

Bubbling scope - Updating var from nested function

我正在更新嵌套函数中外部范围的变量,
因为这是在 init 函数期间发生的,所以外部作用域不是最外层 (window) 作用域;

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);

为了将其保存在初始化函数范围内,我省略了 var 关键字,正如预期的那样,变量的新值冒泡并更新;

但是console.log('x' in window )的结果是假的,
冒泡不是应该到达 window 范围吗?

x 是在您的 init 函数中声明的,所以不,该函数(或其中的任何内容)中的 x 不会解析为全局变量。


另外,在您的问题代码中发表评论:

console.log(x) //  new stuff

...暗示 x 届时将是 "new stuff"。它不会。您没有在任何地方 调用 butClick,因此 x 将具有其原始 "old stuff" 值。

如果您 确实 调用了 butClick,它会更新 init 本地的 x。它不会创建或更新全局。


将您的更新设置 butClick 作为事件处理程序:建议 x 应该是 "new stuff" 的评论仍然是错误的。截至 console.log 行 运行 秒,x 的值为 "old stuff"。 以后,如果有人点击按钮,x会被butClick更新,但不会追溯-运行 console.log 行。

但即使在响应点击时被调用,butClick 仍在更新 init 内的 x,而不是全局更新。变量作用域是由词法决定的,而不是由调用函数的位置决定的 from.