【问题标题】:Bubbling scope - Updating var from nested function冒泡范围 - 从嵌套函数更新 var
【发布时间】:2015-01-29 11:09:09
【问题描述】:

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

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

【问题讨论】:

  • 这里没有事件,event-bubbling标签无关。
  • 你说得对,我更新了代码示例
  • 我已更新答案以解决编辑问题。它仍然不会更改记录的内容,也不会创建全局变量。

标签: javascript scope lexical-scope


【解决方案1】:

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


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

console.log(x) //  new stuff

...暗示x 在那时将是“新东西”。它不会。你还没有在任何地方调用butClick,所以x 将拥有它原来的“旧东西”值。

如果您确实在某个时候调用了butClick,它将更新x 本地的init。它不会创建或更新全局变量。


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

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

【讨论】:

  • 如果我希望它在第一次点击后变为全局,有什么办法吗?
  • @maioman:在浏览器环境中,您始终可以通过分配给全局对象的属性来创建全局变量,您可以通过其属性window 来引用它。所以:window.x = "some value"; 创建或更新一个全局的x 变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
相关资源
最近更新 更多