Javascript闭包显示省略结果

javascript closure show omit result

本文关键字:结果 显示省 闭包 Javascript      更新时间:2023-09-26

我是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)。为什么?

因为闭包实际上并没有关闭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
};

您也可以更改cbsample函数中的value变量以识别差异:-)

问题可能出在这一行:

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; 
 };