javascript对象的值不变(通过引用传递)

时间:2016-05-29 05:36:09

标签: javascript closures 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对象通过引用传递,为什么它没有&#39}。打印5?

1 个答案:

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

希望有所帮助