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

时间:2015-07-04 15:29:39

标签: javascript function closures

为什么这不按预期工作?

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

2 个答案:

答案 0 :(得分:0)

像@thefourtheye一样建议我做什么

external(); 

仅返回internel函数对象。

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

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

答案 1 :(得分:0)

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

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

没有任何反应,因为函数只是表达但从未执行过。

相比之下,对于var func = external();,函数表达式被赋值给变量func。实际上,它相当于写作:

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

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