javascript 对象的值未更改(通过引用传递)

value of javascript object not changing (pass by reference)

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 中对象是通过引用传递的,为什么它没有'打印 5?

使用 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 作为答案

希望对您有所帮助