代码之家  ›  专栏  ›  技术社区  ›  maioman

冒泡作用域-从嵌套函数更新var

  •  0
  • maioman  · 技术社区  · 10 年前

    我正在从嵌套函数的外部范围更新变量,
    因为这是在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函数范围中,我省略了 变量 关键字,并且如预期的那样,变量的新值冒泡并更新;

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

    1 回复  |  直到 10 年前
        1
  •  2
  •   T.J. Crowder    10 年前

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


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

    console.log(x) //  new stuff
    

    …暗示着 x(x) 届时将是“新的东西”。不会的。你还没有 打电话 butClick 任何地方,所以 x(x) 将具有其原始的“旧物”价值。

    如果你 呼叫 但单击 在某些时候,它会更新 x(x) 这是本地的 初始化 。它不会创建或更新全局。


    重新设置更新设置 但单击 作为事件处理程序:建议 x(x) 应该是“新的东西”仍然是错误的。截至 console.log 线路运行, x(x) 具有“旧东西”的价值。 后来 ,如果有人单击按钮, x(x) 将由更新 但单击 ,但这不会追溯性地重新运行 控制台日志 线

    但即使当响应于点击而被调用时, 但单击 仍在更新 x(x) 在内部 初始化 ,而不是全局。变量范围由词汇决定,而不是由调用函数的位置决定 从…起 .