【发布时间】:2011-10-27 06:13:35
【问题描述】:
当answering另一个问题时,我正在使用这种模式递归调用函数:
(function() {
// ...
if(should_call_again) arguments.callee();
})();
这很有效。我得到反馈说命名函数也有效:
(function func() {
// ...
if(should_call_again) func();
})();
但是,使用这种技术,window.func 是 undefined,这让我很惊讶。
如果我简单地说,我的问题是:为什么以下是正确的?
function a() {}
typeof window.a; // "function"
(function b() {})
typeof window.b; // "undefined"
b 仍然可以访问 inside b 本身。所以看起来( ) 创建了另一个作用域,但事实并非如此,因为只有函数会创建另一个作用域,而我只是将它包装在( ) 中。
那么为什么在( ) 中包装一个函数不会将函数放入全局对象中呢?
【问题讨论】:
-
我不知道为什么该函数可以通过其名称访问,但将定义包装在
()中使其成为函数表达式,即使它们有名称,它也不会在当前范围。 -
它可能已经过评估,并且由于它没有分配给变量,因此它不会出现在该范围内。
-
也许在函数调用时创建的激活对象通过其名称引用了函数本身。即使您将函数分配给变量,也可以从函数内部通过其名称访问它。
-
要解释为什么函数可以在函数内部通过其名称访问,请参阅此答案:stackoverflow.com/questions/7065120/…
-
@Felix Kling:我认为这回答了我的问题。
... the Identifier in a FunctionExpression cannot be referenced from and does not affect the scope enclosing the FunctionExpression.
标签: javascript function scope window global