我正在更新嵌套函数中外部作用域的变量,
因为这在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 )
的结果是假的,
是不是应该到窗口范围的冒泡?
答案 0 :(得分:2)
x
在您的init
函数中声明,所以不,该函数内的x
(或其中的任何内容)将无法解析为全局函数。
另外,在你的问题代码中发表评论:
console.log(x) // new stuff
......暗示x
将成为“新东西”。它不会。你没有在任何地方调用 butClick
,因此x
将拥有原始的“旧东西”价值。
如果您 在某个时候呼叫butClick
,它会将x
更新为本地init
。它不会创建或更新全局。
将您的更新设置butClick
作为事件处理程序:建议x
的评论应该是“新内容”仍然是错误的。截至console.log
行运行时,x
的值为“旧东西”。 稍后 ,如果有人点击该按钮,x
将butClick
更新,但不会追溯重新运行{{1}行。
但即使在响应点击时调用,console.log
仍在更新butClick
内的x
,而不是全局。变量范围是由词汇决定的,不是由从调用函数的位置确定的。