javascript闭包显示省略结果

时间:2013-06-07 06:33:17

标签: javascript

我在javascript中很新,并尝试一些编码。看看这段代码片段,为什么我得到结果2而不是3?

var cbsample = function (cb) {

    var value = 1;
    console.log(value);
    return cb(value)(value);

};

var myvalue = cbsample(function (value) {

    value += 1;
    console.log(value);
    return function (value) {
        console.log(value);
        return value += 1;
    };

});

console.log(myvalue);

当我调用回调时,它将值更改为2,但是闭包没有采用这个新值(2),它采用旧值(1)。为什么呢?

2 个答案:

答案 0 :(得分:3)

因为闭包实际上没有关闭value :-)你给内部函数一个value参数,它将引入一个局部变量,遮蔽外部变量。所以,不,它不采用旧的(外部)值,它不采用新的(外部的)value,而是采用不同的 value(恰好也是1。 将其更改为

return function (v) {
    console.log("old value (from the closure):", value);
    console.log("new value (the arguments):", v);
    return value += v; // update closure variable and return 3
};

您可以更改value函数中的cbsample变量,以确定差异: - )

答案 1 :(得分:1)

问题可能就在这一行:

return cb(value)(value);

您正在使用相同的参数cb调用外部函数value和该函数的结果,该参数在此时具有值1.

 var cbsample = function (cb) {

    var value = 1;
    console.log(value);        //1
    return cb(value)(value);   //return cb(1)(1);

};

var myvalue = cbsample(function (value) {

    value += 1;
    console.log(value);           //2
    return function (value) {     //this function will get called with 1 as argument
        console.log(value);
        return value += 1;        //return 2
    };

});

console.log(myvalue);             //2

要解决这个问题,你可以在函数调用和定义中删除内部返回函数的参数:

 return cb(value)();

 //....

 return function () {     
     console.log(value);
     return value += 1; 
 };