为什么'(function a(){})'没有把'a'放到全局对象中?

时间:2011-08-15 12:41:56

标签: javascript function scope window global

answering另一个问题时,我正在使用这种模式递归调用函数:

(function() {
    // ...
    if(should_call_again) arguments.callee();
})();

哪个有效。我得到了反馈,命名函数也有效:

(function func() {
    // ...
    if(should_call_again) func();
})();

但是,使用这种技术,window.funcundefined,这让我感到意外。

如果我简单地说,我的问题是:为什么以下是真的?

function a() {}
typeof window.a; // "function"

(function b() {})
typeof window.b; // "undefined"

b仍然可以在 b内部进行访问。所以似乎( )创建了另一个范围,但情况并非如此,因为只有函数创建另一个范围,而我只是将它包装在( )内。

那么为什么在( )中包装函数不会将函数放入全局对象?

2 个答案:

答案 0 :(得分:5)

因为您没有编写函数声明,而是编写函数表达式

函数表达式中定义的函数只有在将它们分配给变量时才会存储到某个位置;你没有这样做;你马上就叫它。


在[非常宽松!]意义上,您可以将函数声明视为函数表达式赋值的一种特殊形式:

function a() {}
// vs:
var a = function() {};

这仍然不是一个严格准确的比较,但它可能有助于理解函数声明是一种特殊的东西。

答案 1 :(得分:0)

您似乎忽略了一个细微差别,而不是将功能定义为:

(function b () { });

它实际上写成:(注意最后一组额外的父母)

(function b () { }());

当你编写这样的函数时,会立即调用它,但仍然有自己的范围。