function outerFunction(x){
return function(y){
x=x+1;
console.log(x+y);
}
}
var myVal = new Number(2); //myVal is an object
console.log(myVal); //prints Number{[[PrimitiveValue]]: 2}
var innerFunction = outerFunction(myVal); //I'm passing myVal obj
innerFunction(10) //13
innerFunction(10) //14
innerFunction(10) //15
console.log(myVal); //prints Number{[[PrimitiveValue]]: 2} instead of 5?
我希望最后console.log
打印Number{[[PrimitiveValue]]: 5}
,因为我将myVal object
传递给outerFunction
,并且JS对象通过引用传递,为什么它没有&#39}。打印5?
答案 0 :(得分:2)
使用console.log的简单解释(在这种情况下,请检查javascript在控制台中打印的内容):
function outerFunction(x){
return function(y){
console.log("type of x", typeof x);
console.log("value x:",x);
console.log("value y:",y);
x=x+1;
console.log(x+y);
}
}
var myVal = new Number(2); //myVal is an object
console.log(myVal); //prints Number{[[PrimitiveValue]]: 2}
var innerFunction = outerFunction(myVal); //I'm passing myVal obj
innerFunction(10) //13
innerFunction(10) //14
innerFunction(10) //15
console.log("type of myval",typeof myVal);
console.log(myVal); //prints Number{[[PrimitiveValue]]: 2} instead of 5?//
此处代码中发生了什么。
==>首先,您不能使用+运算符在javascript中添加两个对象。所以javascript将它转换为数字或字符串(在这种情况下是一个数字,因为你传递一个数字本身,这是一个基本类型)
==>您返回的内部函数具有外部函数的外部引用X. (因为关闭)
==>每次增加X时,外部函数范围内的x值都会发生变化,但它现在对全局" myVal"没有影响。变量(类型对象),因为javascript将本地X视为基本类型(在第一点中解释,它是通过值而不是通过引用传递的)
==>因此,全局值保持不变,X不断变化,内部函数访问,这就是为什么你看到13,14,15作为答案
希望有所帮助