2016-05-29 52 views
0
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 objectouterFunction和JS對象是通過引用傳遞,它爲什麼沒有打印5?使用的console.log值對象不改變(按引用傳遞)

+0

回覆:「在JS對象是通過引用傳遞」:這不是真的(因爲你的代碼的惡魔trates)。 – ruakh

+0

@ruakh我將我的代碼更改爲var myObj = {a:2},並將myObj傳遞給outerfunction ..並執行了x.a = x.a +1;和console.log確實已更改爲{a:5},確認對象通過引用傳遞 –

+0

@ruakh對象作爲引用的副本傳遞,因此您必須區分突變和重​​新分配 – rand

回答

2

簡單的解釋(做檢查什麼的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作爲回答

希望它可以幫助

+1

它被稱爲currying – brk

+1

@Wild **這是一個不足的迴應**:'myVal'不是一個函數,而是一個對象。通過共享參考副本來傳遞對象。正確的評估策略是**通過分享**。所以OP的假設幾乎是正確的,'Objects'是通過(副本)引用傳遞的。有了這個評估策略,你必須區分突變'let n = new Number(2); n.x = true;'and reassignment'let n = new Number(2); n = 3;' – rand

+0

@lven,你能否詳述一下你的觀點?還有我的觀點沒有打字錯誤。 3我已糾正。 –