2012-10-31 89 views
0

因此,我正在嘗試執行以下操作:在arg中通過引用傳遞類變量

var myVar; 

function testFunction(args){ 
args.cacheVar = new Date(); 
} 

testFunction({cacheVar:myVar}); 

但是不是改變myVar的值,而是改變args.cacheVar的值。 我想要發生的是myVar = new Date()。不是args.cacheVar。

我該如何用我目前的設置來完成這項工作? (使用參數)

+0

你的意思是將對象的'cacheVar'屬性從'myVar'改爲'new日期()'?或者你的意思是改變變量'myVar'的值並給它'new Date()'?爲什麼它必須通過'arguments'? – Joseph

回答

0

您沒有將myVar傳遞給您的函數。你正在傳遞一個對象。該對象可能會更新,但由於您在任何地方都沒有引用,所以沒有任何反應。

在傳遞它之前,您需要將對象保存爲變量。

var myVar = {cacheVar:null}; 

function testFunction(args){ 
    args.cacheVar = new Date(); 
} 

testFunction(myVar); 
1

你傳遞給testFunction參考沒事,但它是一個對象字面你動態創建一個參考:testFunction({cacheVar:myVar}); < - {}是引用的對象。它從來沒有分配給任何變量,所以只要testFunction返回,它就會被GC'ed。
cacheVar財產分配副本myVar的值(在這種情況下未定義)。你必須記住,只有通過引用typeof something傳遞的對象將返回object數組,對象的文字,自定義對象的功能......但可以返回undefinedstringbooleannumber這些都是原語。 null是證明此規則的例外(由於歷史原因,它返回object)。

如果你想改變的myVar值,只需使用myVar

function testFunction() 
{ 
    myVar = new Date(); 
} 
//alternative: 
function testFunction() 
{ 
    return new Date(); 
} 
var myVar = testFunction(); 

第一種方式,但是,是不是很安全(隱含的全局),所以要麼直接返回所需的值的變量你想改變(第二版本),使用閉包或將所有東西變成一個對象,但是現在可能會讓我們太過分了。