2013-01-19 80 views
0

我試圖將我的一箇中等規模的JavaScript API從「許多全局變量和函數」轉換爲更類似於jQuery和其他井中使用的命名空間封裝的東西深思熟慮的JavaScript庫。爲了實現這一點,我使用匿名函數。JavaScript booleans作爲值返回值,而不是引用

下面的代碼片段:

(function(window, undefined) { 
    var MyLib = (function() { 
     var AbortProgram = true; 
     function DisplayAbortProgram() { alert('AbortProgram inside=' + AbortProgram); } 
     return { AbortProgram: AbortProgram, DisplayAbortProgram: DisplayAbortProgram } 
    }()) 
    window.MyLib = MyLib; 
})(window); 

MyLib.AbortProgram = false; 
alert('AbortProgram outside=' + MyLib.AbortProgram); 
MyLib.DisplayAbortProgram(); 

運行時,AbortProgram外值爲false,但內在價值仍然是正確的。這篇文章是爲了證實這種情況發生的原因?我相信這是因爲return語句返回的是DisplayAbortProgram的值,而不是對它的引用。其根本原因是JavaScript返回基本類型的值而不是引用 - 對象通過引用傳遞。

我讀過這個,並相信沒有辦法返回對該布爾變量的引用,所以我將不得不實現一個名爲SetAbortProgram(value)的函數。

回答

2

AbortProgram被關閉隱藏,你不能改變它。這通常是您使用的模式的目標。

你用MyLib.AbortProgram = false;做什麼不會改變現有的隱藏變量,但會增加一個新的AbortProgram變量。

如果你想AbortProgram修改,簡化你的代碼

var MyLib = { 
     AbortProgram: true, 
     DisplayAbortProgram: function DisplayAbortProgram() { alert('AbortProgram inside=' + this.AbortProgram); } 
}; 

MyLib.AbortProgram = false; 
MyLib.DisplayAbortProgram(); 

要不然制定者添加到您的現有代碼:

(function(window, undefined) { 
    var MyLib = (function() { 
     var AbortProgram = true; 
     function DisplayAbortProgram() { alert('AbortProgram inside=' + AbortProgram); } 
     function setAbortProgram(v) {AbortProgram=v} 
     return { AbortProgram: AbortProgram, DisplayAbortProgram: DisplayAbortProgram, setAbortProgram:setAbortProgram} 
    }()) 
    window.MyLib = MyLib; 
})(window); 

MyLib.setAbortProgram(false); 
alert('AbortProgram outside=' + MyLib.AbortProgram); 
MyLib.DisplayAbortProgram(); 
+0

我已經去了setter代碼 –

2

你是對的,它是一個傳值而不是參考。創建一個參數對象。這將通過引用傳遞:

var args = { AbortProgram: true }; 

args周圍,而不是AbortProgram。您可以通過args.AbortProgram訪問您的布爾值。

1

的根本原因是,JavaScript的返回值對於一些原始類型而不是引用。

不僅一些。所有基元類型都將作爲值傳遞。只有對象是對其屬性的引用。

我讀過這個,並相信沒有辦法返回對該布爾變量的引用,所以我將不得不實現一個名爲SetAbortProgram(value)的函數。

是的,如果你想改變變量。但是,您可以隨處使用對象的屬性。

+0

我已經編輯了這個問題來刪除關於原語的「some」 –