0

在观看Learning to Love 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

4

2 回答 2

4

它打印出来是因为该函数确实返回了一个函数。

尝试

ctr()();

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

也就是说,如果您的测试与第一个设置类似:

var actualCtr = ctr();

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

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

于 2012-07-17T19:26:38.827 回答
1

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

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

这是您的第二个代码的有效版本:

var ctr = (function() {
        var i = 0;
        return function() {
            console.log(++i);
        }
    })();
ctr();
ctr();
ctr();
于 2012-07-17T19:31:12.843 回答