为什么调用此函数?

时间:2014-04-16 16:11:43

标签: javascript function

为什么这段代码有效? - http://jsfiddle.net/Mq9Ap/1/

$(function() {

    function outer() {
        var counter = 0;
        function inner() {
            alert(counter);
            counter++;
        }
        return inner;
    }

    var x = outer(); // As we're calling outer here, x is a reference to inner 
    x(); // alerts 0
    x(); // alerts 1

});

但如果我将return inner更改为return inner()

,它只运行一次

编辑:

我通过提及括号来混淆我的问题的意图。我仍然很困惑如何调用内部函数,因为x()只指向外部函数。

如果返回值是指向函数的指针,编译器是否知道它应该调用函数?

4 个答案:

答案 0 :(得分:2)

return inner返回内部函数。然后可以调用它。

return inner()立即运行内部函数(警告0),然后返回其返回值(未定义)。然后,您会收到undefined不是函数的错误(当x()尝试调用它时)。

答案 1 :(得分:0)

执行return inner();时,实际上是在调用inner并返回返回值,在本例中为undefined,因为实际上没有返回任何内容。这将导致错误,因为undefined不是函数(当您尝试通过x()调用它时)。

执行return inner;时,实际上是在返回对内部函数的引用。

答案 2 :(得分:0)

这是你返回的事实。

return inner();实际调用内部函数并获得结果。该结果将被退回。由于inner函数未显式返回任何内容,因此默认情况下它返回undefined。现在x未定义。您无法对未定义的x进行调用。

return inner;实际上返回对内部函数的引用。所以现在x引用了一个函数。您可以执行实际调用x()闭包函数的inner

答案 3 :(得分:0)

我想我已经破解了它;我的困惑并不是return inner;,而是:

var x = outer();

我现在明白x保存外部的返回值,因为()调用b的函数引用,所以如果我们现在添加另一个()返回此返回value,然后调用引用的内部函数,类似于outer()();

function outer() {
    var counter = 0;
    function inner() {
        console.log(counter);
        counter++;
    }
    return inner;
}

outer()();
outer()();
outer()();

//output
0
0
0

var x = outer(); 
x();
x();
x();

//output
0
1
2

最后一部分var x有效,因为外部已使用outer()调用。当每次使用x();调用内部时,计数器已经在堆栈上,因此内部函数将其视为静态变量...我假设。

混淆这个javascript :(

编辑:

另一个尤里卡时刻 - 我意识到outer()();不起作用,因为每次调用第一个outer()时,它都会创建一个新的函数上下文,并且每次都会初始化var counter在堆栈上,当第二次调用被调用时,计数器将始终设置为零。

x = outer();保留了之前函数调用的计数器值,因为函数上下文保存在x中,var counter仅初始化一次,因此它永远不会重置。< / p>