为什么这个闭包返回函数

Why does this closure return function?

本文关键字:返回 函数 闭包 为什么      更新时间:2023-10-23

在观看Learning to Love JavaScript时,我对为什么第二个版本不起作用感到困惑。它只是返回"function"。闭包是否不允许直接分配变量?

function getCtr() {
    var i = 0;
    return function() {
        console.log(++i);
    }
}
var ctr = getCtr();
ctr();
ctr();
ctr();
/* console
1
2
3
*/
/*--------------------------------------
 *   This doesn't work
 */
var ctr = function() {
    var i = 0;
    return function() {
        console.log(++i);
    }
}
ctr();
ctr();
ctr();
/*   console
 *   => [Function]
 */

视频链接http://youtu.be/seX7jYI96GE?t=11m12s

它打印它,因为函数确实返回了一个函数。

尝试

ctr()();

您使用的两种形式的函数声明具有几乎完全相同的效果。两者都只需创建一个函数并将其绑定到一个符号。在第二个版本中,您真正更改的只是所涉及的名称("ctr"而不是"getCtr")。

也就是说,如果你的测试像第一次设置一样:

var actualCtr = ctr();
actualCtr();
actualCtr();
actualCtr();

你会发现它真的是一样的。

在您的第一个版本中,您定义了一个函数getCtr。然后调用getCtr,将结果保持为ctr。然后重复调用ctr。您正在调用调用函数的结果。

在第二个版本中,您将ctr定义为第一个函数,然后重复调用它。您没有调用调用函数的结果。

下面是您的第二个代码的一个版本:

var ctr = (function() {
        var i = 0;
        return function() {
            console.log(++i);
        }
    })();
ctr();
ctr();
ctr();