为什么我必须先将外部函数分配给变量才能调用它?

Why do I have to assign the external function to a variable before I can invoke it?

为什么这没有按预期工作?

function external() {    
    function internal() {
        alert("external");
    }
    return internal;
}
external(); //nothing happens

var func = external();
func(); // alert pops up

这与它是一个闭包这一事实有关吗?因为这里它的工作方式与我预期的一样:

function test() {
     alert("test");   
}
test(); //alert pops up without assigning the function to a variable

就像@thefourtheye 在我刚刚做的时候建议的那样

external(); 

仅返回内部函数对象。

我刚刚添加了一个示例以使其更清楚!

function external() {    
    alert("foo");
    function internal() {
        alert("bar");
    }
    return internal;
}
external(); //returns foo (and the internel function)
external()(); //return foo and then bar

当你return internal时,它正在返回一个函数。该函数未执行,仅作为引用传递回外部函数的调用者。所以 external() 基本上计算为未执行的函数表达式。它实际上等同于写作:

function() {
    alert("external");
}

没有任何反应,因为该功能只是简单地表达但从未执行过。

相反,对于var func = external();,函数表达式赋值给变量func。实际上,它等同于这样写:

var func = function() {
    alert("external");
}

这就是为什么当您随后执行 func() 时,弹出警报。