2013-06-28 74 views
1

我有一個函數產生的GUID來進行測試:從javascript函數傳遞guid作爲值而不是參考的最佳方式?

helpers.guid = function(){ 
    var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
     var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 
     return v.toString(16); 
    }); 
    return guid; 
}; 

我把它叫做:

var thisTest.guid1 = helpers.guid(); 
var thisTest.guid2 = helpers.guid(); 

的問題是每一個我指的是thisTest.guid1這是一個不同的GUID的時間。我需要將對象屬性設置爲一個永久值,我不知道該怎麼做。我試着添加一個閉包,但無法讓它工作。

編輯:爲了澄清,我需要能夠生成多個GUID並將每個GUID分配給不同的變量。現在每當我引用一個變量時,我會得到一個新的guid,因爲它可能會再次調用該函數並返回一個新值。我需要「guid1」和「guid2」在每次使用時都是相同的值。

+0

也許是這樣的:http://jsfiddle.net/RGu4p/ – Ian

+0

或者可能是 「更好」:http://jsfiddle.net/RGu4p/1/。這個例子只在第一次需要時纔會生成guid。我的第一示例立即執行並保持該值永遠 – Ian

+0

「變種thisTest.guid = helpers.guid();」拋出錯誤。我複製粘貼你的代碼,固定這項測試變量並沒有象你所說的沒有問題,thisTest.guid實際上是一個字符串,而不是功能http://jsfiddle.net/VV3rN/ – Alexey

回答

1

問題標題比不必要複雜的代碼示例和文本要簡單得多...讓我們使用更簡單的代碼。

var seed = 1 ; 
function generate() { 
    return seed++ ; 
} 
     var a = generate() ;  
alert(a + "\n" + a + "\n" + a) ; 

這當然顯示「1」三次......它會,而不管它是一個對象屬性還是變量。函數的返回值保存在內存中,因爲它被變量a引用。對象屬性當然會表現相同:

var a = { b : generate() }; 
     alert(a.b + "\n" + a.b + "\n" + a.b) ; 

這將再次顯示「1」三次。同樣,每次調用generate()都會產生新的值。

var a = {b:generate(), c:generate(), d:generate() }; 
alert(a.b + "\n" + a.c + "\n" + a.d) ; 

這將輸出「1」,「2」和「3」。每次調用函數都會返回一個由不同對象屬性引用的值,因此我們有三個不同的值。

0

如果我理解正確,你可以使用2個功能:

1 - 一個函數生成GUID,然後在一些地方保存它的地方,像 在一個隱藏的控制窗體上,這樣你就可以得到後來

2-檢索您的隱藏控件的值的函數吧。

相關問題