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

标签 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 ) 的结果是 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/

相关文章:

javascript - 匹配多个字母的准确出现次数

javascript - 我们可以省略 JavaScript IIFE 的主要括号吗?

JavaScript INDEX_SIZE_ERR : DOM Exception 1

javascript - 丢失全局变量值

javascript - 'this' 在原型(prototype)中指什么?

javascript - With block 中的变量声明

javascript - DOM树创建

readline 对象的 Javascript 范围

javascript - 将功能放在另一个范围内?

javascript - 如果没有 block 范围,独立 block 有什么意义?