2010-12-16 95 views
2

這是jQuery代碼相當於這是什麼未知的JavaScript語法?

$(document).ready(function() { 
}); 

如果是

(function(jQuery){ 
})(jQuery); 

,什麼是兩者之間的區別是什麼?如果不是,第一個做什麼?

編輯:

謝謝大家。大多數響應類似於不同的風味和樣本

+0

這不是jQuery代碼,它是JavaScript代碼。 :) – epascarello 2010-12-16 23:57:09

回答

3

絕對不是,第一個是自動執行的匿名函數,第二個是ready處理程序。

(function(jQuery){ 
    //jQuery in this scope is referencing whatever is passed-in 
})(jQuery); 

因此,函數內的jQuery不一定是功能之外的相同jQuery。但是,您通常不希望將全局變量名與本地變量名進行混合匹配。

拿這個例子:

(function(obj) { 
    alert(obj); 
})('Hello'); 

定義一個函數,然後立即調用它,在 「你好」

5

路過他們是不等價的。

你的第一個例子是Immediately-Invoked Function Expression (IIFE)。它圍繞本地定義的變量創建一個閉包。

第二個示例指定了DOM is fully loaded時執行的功能。它用於在執行封裝代碼之前確保DOM中的所有元素節點都可用。這也是一個封閉。

這兩個示例都使用匿名函數。

這是值得指出的是,這是很好的做法是使用您的兩個例子,像這樣:

(function($){ 
    // locally-scoped, DOM-is-NOT-Ready-code here. 
    $(function() { 
     // your locally-scoped, DOM-is-ready-code here. 
    }); 
}(jQuery)); // note that I've moved the invocation into the parens 
      // that contain the function. This makes JSLint happy! 
+0

你的代碼示例可以簡化爲:'jQuery(function($){});' – 2010-12-17 00:20:18

+0

@ŠimeVidas更新了我的示例,使其更清楚爲什麼我會這樣做。 – Stephen 2010-12-17 00:24:13

2

號第一個是不是真的這樣做了。只需從周圍範圍內分離任何變量,並在裏面創建一個本地jQuery變量。

第二個在 DOM準備好之後(換句話說,在<body>已加載之後)通過運行的函數。

一種常見的等價於:

$(document).ready(function() { 
}); 

是:

$(function() { 
}); 

它做同樣的事情。

這枚:

(function(jQuery){ 
})(jQuery); 

通常寫爲:

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

使得$變量不再是一個全局變量。如果全局的$變量已被使用,則可用。

3
$(document).ready(function() { 

}); 

是相同的:

$(function() { 

}); 

的第一個片段是立即調用匿名函數它創建了一個局部範圍:

(function() { 
    var x = 2; 
})(); 

alert(x); // undefined 
1

不是。第一個是閉包 - 一個你創建並立即調用的函數。但是,通常您將兩者結合起來是這樣的:


    (function($) { 
    // use the $ variable 
    $(document).ready(function(){ 
     // ... 
    }); 
    })(jQuery); 

通過創建封閉要重命名「jQuery的」到「$」只爲本地代碼塊。你使用閉包語法的原因是你可以使用$變量,儘管它可能沒有被定義爲全局範圍內的jQuery對象(即一些JavaScript框架如原型使用$作爲變量)。

每當你編寫一個jQuery插件時,你應該在這種封閉中包含所有的jQuery代碼,所以它不會干擾任何其他的JavaScript框架。如果你沒有編寫插件,也沒有使用任何其他的JavaScript框架,那麼你可能不必費心把你的代碼放在閉包中。

+0

你的代碼可以簡化爲:'jQuery(function($){});' – 2010-12-17 00:16:54

+0

另外,這不是閉包。它只是將一個參數傳遞給一個函數。 – 2010-12-17 00:17:48

+0

@ŠimeVidas:我不同意,任何時候你有一個內在的功能,你有一個閉包。如果代碼中「// ...」是創建一個使用$符號的處理程序,那麼他將通過閉包使用$可用。即使它沒有被使用,也並不意味着它不是封閉的 – 2010-12-17 00:53:45