我在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)。为什么呢?
答案 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;
};