当 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
仍然可以在内部 b
本身访问。所以看起来 ( )
创建了另一个作用域,但事实并非如此,因为只有函数创建了另一个作用域,而我只是将它包装在 ( )
中。
那么为什么将函数包装在 ( )
中而不是将函数放入全局对象中呢?
最佳答案
因为你不是在写一个函数声明,而是一个函数表达式。
在函数 表达式 中定义的函数只有在您将它们分配给变量时才会存储在某个地方;你没有那样做;你只是立即调用它。
在[非常宽松!]的意义上,您可以将函数声明视为一种特殊形式的函数表达式赋值:
function a() {}
// vs:
var a = function() {};
这仍然不是严格准确的比较,但它可能有助于理解函数声明是一种特殊的东西。
关于javascript - 为什么 '(function a() {})'不把 'a'放到全局对象中呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7065021/