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

时间:2015-01-29 11:09:10

标签: javascript scope lexical-scope

我正在更新嵌套函数中外部作用域的变量,
因为这在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 )的结果是假的,
是不是应该到窗口范围的冒泡?

1 个答案:

答案 0 :(得分:2)

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


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

console.log(x) //  new stuff

......暗示x将成为“新东西”。它不会。你没有在任何地方调用 butClick,因此x将拥有原始的“旧东西”价值。

如果您 在某个时候呼叫butClick,它会将x更新为本地init。它不会创建或更新全局。


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

但即使在响应点击时调用,console.log仍在更新butClick内的x,而不是全局。变量范围是由词汇决定的,不是由调用函数的位置确定的。