2012-07-25 22 views
2

這裏是JavaScript的一個常見的做法:JavaScript風格:我應該將哪些東西作爲參數傳遞給我的命名空間函數?

(function($) { 
    ...code... 
})(jQuery); 

我理解的包裝函數(它可以防止全局命名空間的污染),但許多庫(如jQuery,下劃線等)已經定義了短名稱($_)分別在全球範圍內供我使用。我不知道這種方法的優點是什麼。只需要將jQuery重命名爲更短的內容?防止我覆蓋$?以後更容易換入另一個圖書館嗎?我想這些都不是真的令我信服。

而且,我也看到了這一點:

(function(_) { 
    ...code... 
})(_); 

即使沒有這裏重命名。我已經看到:

(function(global) { 
    ...code... 
})(this); // or window, perhaps 

直接使用window有什麼問題?

因此,這裏是我要問:

  • 請問這種做法有名字嗎?
  • 這種做法有什麼優點?
  • 我是否應該總是傳遞我正在使用的庫,而不是直接使用它們?
  • 我是否應該通過thiswindow作爲全球範圍的參考?
+0

爲什麼你列出的理由似乎沒有說服力?你真的需要多少說服力?這只是一個簡單的函數調用,需要很少的成本。 – 2012-07-25 02:14:30

+0

他們似乎不*真的*令人信服,因爲這些原因都與我的小項目無關。重命名爲更短的東西?已經有'$'。防止我覆蓋'$'?不是我曾經做過的事情。之後在另一個圖書館交換?直接替換庫通常使用相同的名稱來爲程序員解決這個問題。 ......從防守編碼的角度來看,所有這些都可能有優勢。 – Calvin 2012-07-25 02:46:30

回答

0

這種做法是否有名字?

該語法被稱爲自執行匿名函數。我不知道將全局對象傳遞給函數的任何特殊名稱。

這種做法的優點是什麼?在函數中

  • 如您所知,var作用域變量將 幫助解除雜波全球namepace。
  • jQuery例子在插件典型地使用,使得該插件可以利用$同時用$.noConflict()(docs)

    (function($) { 
        ...code... 
    })(jQuery); 
    
  • 一般而言剩餘兼容,傳遞全局或保留對象(如windowdocument)作爲參數可以幫助縮小縮小後腳本的大小:

    (function(window, document) { 
        // A JS minifier can now minify the all occurrences of `window` and 
        // `document` within this function. 
    })(window, document); 
    

我是否應該總是傳入我正在使用的庫中,而不是直接使用它們?
我應該通過這個還是作爲全局範圍的參考?

僅當縮小或衝突的庫變量名稱是一個問題時。

0

這種做法的優點是什麼?

如果變量(「_」,‘$’等),後來被一些其他的代碼重寫,你的代碼將繼續按預期工作。它將使用包裝函數調用時傳入的值。

我是否應該總是傳遞我正在使用的庫而不是直接使用它們?

不,但如果您對上述有任何疑慮,這可能是一個很好的做法。另外,如果您查看AMD加載程序(如Require.js),您會發現這是一種熟悉的技術,因爲它們執行類似的操作來定義模塊的需求。

我是否應該在這個窗口或窗口中引用全局範圍?

this的優點是,代碼將運行在任何有全局作用域的地方。例如,如果您的代碼可能運行在Node.js服務器上,則不存在window

相關問題