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

pim*_*vdb 4 javascript scope global window function

回答另一个问题时,我正在使用此模式递归调用函数:

(function() {
    // ...
    if(should_call_again) arguments.callee();
})();
Run Code Online (Sandbox Code Playgroud)

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

(function func() {
    // ...
    if(should_call_again) func();
})();
Run Code Online (Sandbox Code Playgroud)

然而,这种技术,window.funcundefined,里面传来一个让我吃惊.

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

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

(function b() {})
typeof window.b; // "undefined"
Run Code Online (Sandbox Code Playgroud)

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

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

Lig*_*ica 5

因为你不是在写一个函数声明,而是一个函数表达式.

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


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

function a() {}
// vs:
var a = function() {};
Run Code Online (Sandbox Code Playgroud)

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