几乎相同的代码。但是另一个在返回子函数时不会产生输出

时间:2017-04-02 18:07:08

标签: javascript return closures

我正在研究Javascript中的闭包,我看到这个代码示例用于闭包,输出为整数“2”

function foo() {
    var a = 2;

    function bar() {
        console.log( a );
    }
    return bar;
}

var baz = foo();
baz();

我试着通过删除函数foo()的var baz来修改它以查看是否可以看到相同的结果。传递,以减少代码因为我认为它具有相同的逻辑。但在更改后,它不会给我任何输出。这是代码

function foo() {
    var a = 2;

    function bar() {
        console.log( a );
    }
    return bar;
}

foo();

我期待看到相同的结果。因为var baz引用了foo()函数,所以为什么不删除var baz并只执行foo();功能。但我根本没有提供任何输出。谁能告诉我这里发生了什么?

1 个答案:

答案 0 :(得分:2)

您遇到的是呼叫不呼叫功能之间的区别。确实在做

var baz = foo();

将名为bar的来电存储在变量baz中。然后做

baz()

调用/调用

实际上,正如斜视所概述的那样,你可以通过

直接调用函数bar返回的可调用 foo
foo()()

更多详情

考虑您定义的函数foo。因此,foo也可以被视为/可用作可调用的。如果我做

var fou = foo;

然后我可以通过执行

调用变量foo中包含的函数fou
var baz = fou();

此后,可调用bar包含在变量baz中。