2013-10-25 63 views
-1

作爲Javascript中設計模式的新手,我遇到了模塊模式,但我沒有得到命名空間的東西。檢查全局命名空間中的變量是否存在替代名稱

the namespacing part of Addy Osmani's online book about JS Design Patterns,阿迪解釋檢查變量/命名空間存在的那些5種方式:

// This doesn't check for existence of "myApplication" in 
// the global namespace. Bad practice as we can easily 
// clobber an existing variable/namespace with the same name 
var myApplication = {}; 

// The following options *do* check for variable/namespace existence. 
// If already defined, we use that instance, otherwise we assign a new 
// object literal to myApplication. 
// 
// Option 1: var myApplication = myApplication || {}; 
// Option 2 if(!MyApplication){ MyApplication = {} }; 
// Option 3: window.myApplication || (window.myApplication = {}); 
// Option 4: var myApplication = $.fn.myApplication = function() {}; 
// Option 5: var myApplication = myApplication === undefined ? {} : myApplication; 

我真的不明白是怎麼解決的命名問題。

假設在我的代碼嘗試使用myApplication之前設置了myApplication。使用選項1,例如(或實際上所有的選項),似乎沒有任何改變的情況下,所有MyApplication已經使用,但只覆蓋了所有MyApplication以前的值:

// Higher in some script, where I don't know about it 
var myApplication = 'whatever string or object used by the script'; 

// A bit of code later, where I come with my little Module Pattern 
var myApplication = myApplication || {}; // Using Option 1 

myApplication = (function($) { 
    var myAppVariable = 'blabla'; 

    var myAppFunction = function() { 
     // Doing a few things here 
    }; 

    return myAppFunction; 
}) (jQuery); 

// Using the module 
myApplication.myAppFunction(); 

對我來說是非常令人困惑,因爲我不明白它是如何阻止我踩到他人的腳趾。

+0

雅這種模式將不保留原有的所有MyApplication – megawac

+0

但你不繼的模式:你做了有條件的分配,然後立即做一個轉讓而不檢查。作業完全是這樣;如果你沒有做任何事情來避免貶低你的價值,你不會做任何事情來避免貶低你的價值。具體問題是什麼? –

+0

@ dave-newton我想具體的問題是如何避免使用myApplication,如果之前已經在使用(我認爲這些選項應該這樣做)?有沒有簡短的方法來給別名或別的什麼? –

回答

0

當你在JavaScript中加載模塊時,你可能(取決於我猜的代碼)將不得不覆蓋模塊名稱空間中已有的變量。一種流行的模式用於保存可能在加載之前保存模塊名稱的模式,即noConflict()模式。這種模式背後的想法是,您將名稱空間的原始值保存在一個變量中,如果調用noConflict,則用原始值替換您的名稱空間並返回您的庫。該模式可以或多或少優雅寫成這樣:

myModule = "some stuff ya";

(function(namespace, undefined) { 
    var _module = "myModule"; 
    var __originalModule = namespace[_module];//holds the original value in case you wish to restore it 

    /****** Code your module here following whichever module pattern you wish to follow ****/ 
    var module = { 
     log: function() { 
      if(console.log) { 
       console.log(arguments); 
      } 
     } 
    } 
    /****** End of your module ****/ 

    //calling this method will remove your module from the namespace and replace it with whatever 
    // originally held your module name. 
    //This function returns your module 
    module.noConflict = function() { 
     namespace[_module] = __originalModule; 
     return module; 
    } 

    namespace[_module] = module; //add your module to the namespace 

})(window); 

console.log(window.myModule); // => {log: function...} 
var myMod = window.myModule.noConflict(); 
console.log(window.myModule); // => "some stuff ya" 
相關問題