【问题标题】:how come calling window.init from a global init function doesn't cause an infinite recursion?为什么从全局 init 函数调用 window.init 不会导致无限递归?
【发布时间】:2014-01-09 06:46:09
【问题描述】:
那么,这段代码怎么不会无限循环呢?
window.init = function(){
console.log("window.init")
}
function init(){
console.log("init")
window.init();
}
init();
jsfiddle:http://jsfiddle.net/FAt6C/
【问题讨论】:
标签:
javascript
function
global-scope
【解决方案1】:
您的代码设置为在加载时运行(参见左上角的框),这基本上告诉 jsFiddle 将此代码包装在一个函数中,然后将其设置为 onload 处理程序。 function init() 实际上是在该事件处理程序的范围内声明的,而不是在窗口中。
即使您不包装代码,函数声明也基本上作为设置当前范围的一部分运行,在该范围内的其他内容之前运行(ECMA-262,§10.5)。所以init 在你说window.init =... 之前就已经存在,并且那个赋值语句会覆盖损坏的init。这意味着如果您将换行设置为“无换行”(无论位置如何),您应该只会在控制台中看到“window.init”。