javascript - 为什么 '(function a() {})'不把 'a'放到全局对象中呢?

标签 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 本身访问。所以看起来 ( ) 创建了另一个作用域,但事实并非如此,因为只有函数创建了另一个作用域,而我只是将它包装在 ( ) 中。

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

最佳答案

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

在函数 表达式 中定义的函数只有在您将它们分配给变量时才会存储在某个地方;你没有那样做;你只是立即调用它。


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

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

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

关于javascript - 为什么 '(function a() {})'不把 'a'放到全局对象中呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7065021/

相关文章:

javascript - 提交表单时自动 "download"PDF

Javascript动态向对象添加值

Azure Function TimeTrigger 一遍又一遍地运行

c++ - 回文函数(字符串、堆栈、队列)

javascript - jQuery 变量作用域/调用顺序

kotlin - 控制 Kotlin DSL 构建器中的范围

javascript - 在 javascript 中设置时,Chrome 不加载 img src

javascript - 如何在html中隐藏复选框?

function - 更改函数中的全局 slice

c++ - 将局部变量声明为右值引用是否无用,例如T&& r = move (v)?