2009-06-23 47 views
10

我看着jQuery UI的代碼,我發現每一個文件,這樣的結構開始:這位javascript的結果是什麼?

;jQuery.ui || (function($) { 

我的問題是:爲什麼會出現jQuery之前一個分號,爲什麼是邏輯或正在做?

JRH

+0

您的第一個問題是[JavaScript庫中的前導分號做什麼?](http://stackoverflow.com/q/1873983/1048572) – Bergi 2016-06-10 21:44:04

+0

或其他方式的副本?你鏈接的問題比這個新的幾個月更新.. – jrharshath 2016-06-13 17:07:10

回答

21

爲什麼有jQuery的前一個分號?

分號用於確保安全文件連接。 (庫和庫組件經常被打包成單個文件)

爲什麼邏輯OR正在完成?

右側的自助匿名函數只有在語句的左側計算爲falsey值時纔會運行。因此,如果頁面上已存在jQuery.ui,則該函數將不會運行。它只在jQuery.ui尚不存在時運行。

1

在英語中,該行代碼說:要麼jQuery.ui存在,或定義此功能...

例如如果沒有定義jQuery.ui,那麼該函數將被創建。

最初的分號應該沒有作用 - 它只是分隔代碼語句的結尾。

1

我認爲正在完成邏輯OR以允許多次包含(和評估)文件,而不是clobber本身:如果再次加載它,jQuery.ui將會被定義,並且它不會做任何事情。

如果有人丟失了腳本標記,該文件可能會被錯誤地包含多次。

至於分號,我只能猜測這是一個安全措施,以確保文件如果包含在另一個文件中也可以工作,即使最後一個語句沒有以分號結尾。

僞造的分號不會造成傷害,可能會丟失分號。

6

我猜;是爲了確保JavaScript包裝工不會搞砸線,但這是我擁有的最好的。

邏輯或是否確保jQuery.ui不會被聲明兩次。 JavaScript確實會短路,所以如果左側評估結果爲truthey(謝謝JP!),它不會評估||的右側。

Bonus語法解密,傳遞給匿名函數的$是對jQuery的引用。我不得不向下滾動頁面,一路前一個點擊:-)

所以,這裏的線的細分版本以上

;    // extra semi colon to ensure correct concatenation and minifying 
jQuery.ui  // check if the variable called jQuery.ui is truthey 
||    // OR if jQuery.ui isn't defined 
(function($) {...})(jQuery); // define and execute an anonymous function 
          // passing in the conflict safe jQuery 
          // as the parameter called $