0

我正在从嵌套函数的外部范围更新变量,
因为这是在初始化函数期间发生的,外部范围不是最外部(窗口)范围;

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 ) 是假的,
不是冒泡应该到达窗口范围吗?

4

1 回答 1

2

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


另外,您问题代码中的注释:

console.log(x) //  new stuff

...暗示那x将是“新事物”。它不会。你没有在任何地方打电话 butClick,所以x会有它原来的“旧东西”价值。

如果您确实butClick在某个时候打电话,它会将x本地更新为init. 它不会创建或更新全局。


将您的更新设置重新设置butClick为事件处理程序:建议x应该是“新东西”的评论仍然是错误的。截至该console.log行运行时,x具有“旧东西”的价值。稍后,如果有人单击该按钮,x将由 更新butClick,但不会追溯重新运行该console.log行。

但即使在响应点击时调用,butClick仍在更新 inside xinit而不是全局。变量范围是词法确定的,而不是由调用函数的位置确定

于 2015-01-29T11:16:13.620 回答