为什么这个闭包返回功能?

时间:2012-07-17 19:25:47

标签: javascript closures

在观看学习爱情JavaScript的过程中,我不知道为什么第二个版本无效。它只返回'功能'。是不允许关闭直接分配给它的变量?

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

2 个答案:

答案 0 :(得分:4)

打印出来,因为函数 会返回一个函数。

尝试

ctr()();

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

也就是说,如果您的测试与第一次设置相同:

var actualCtr = ctr();

actualCtr();
actualCtr();
actualCtr();

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

答案 1 :(得分:1)

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

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

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

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