這是jQuery代碼相當於這是什麼未知的JavaScript語法?
$(document).ready(function() {
});
如果是
(function(jQuery){
})(jQuery);
,什麼是兩者之間的區別是什麼?如果不是,第一個做什麼?
編輯:
謝謝大家。大多數響應類似於不同的風味和樣本
這是jQuery代碼相當於這是什麼未知的JavaScript語法?
$(document).ready(function() {
});
如果是
(function(jQuery){
})(jQuery);
,什麼是兩者之間的區別是什麼?如果不是,第一個做什麼?
編輯:
謝謝大家。大多數響應類似於不同的風味和樣本
絕對不是,第一個是自動執行的匿名函數,第二個是ready
處理程序。
(function(jQuery){
//jQuery in this scope is referencing whatever is passed-in
})(jQuery);
因此,函數內的jQuery
不一定是功能之外的相同jQuery
。但是,您通常不希望將全局變量名與本地變量名進行混合匹配。
拿這個例子:
(function(obj) {
alert(obj);
})('Hello');
定義一個函數,然後立即調用它,在 「你好」
路過他們是不等價的。
你的第一個例子是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!
你的代碼示例可以簡化爲:'jQuery(function($){});' – 2010-12-17 00:20:18
@ŠimeVidas更新了我的示例,使其更清楚爲什麼我會這樣做。 – Stephen 2010-12-17 00:24:13
號第一個是不是真的這樣做了。只需從周圍範圍內分離任何變量,並在裏面創建一個本地jQuery
變量。
第二個在 DOM準備好之後(換句話說,在<body>
已加載之後)通過運行的函數。
一種常見的等價於:
$(document).ready(function() {
});
是:
$(function() {
});
它做同樣的事情。
這枚:
(function(jQuery){
})(jQuery);
通常寫爲:
(function($){
})(jQuery);
使得$
變量不再是一個全局變量。如果全局的$
變量已被使用,則可用。
$(document).ready(function() {
});
是相同的:
$(function() {
});
的第一個片段是立即調用匿名函數它創建了一個局部範圍:
(function() {
var x = 2;
})();
alert(x); // undefined
不是。第一個是閉包 - 一個你創建並立即調用的函數。但是,通常您將兩者結合起來是這樣的:
(function($) {
// use the $ variable
$(document).ready(function(){
// ...
});
})(jQuery);
通過創建封閉要重命名「jQuery的」到「$」只爲本地代碼塊。你使用閉包語法的原因是你可以使用$變量,儘管它可能沒有被定義爲全局範圍內的jQuery對象(即一些JavaScript框架如原型使用$作爲變量)。
每當你編寫一個jQuery插件時,你應該在這種封閉中包含所有的jQuery代碼,所以它不會干擾任何其他的JavaScript框架。如果你沒有編寫插件,也沒有使用任何其他的JavaScript框架,那麼你可能不必費心把你的代碼放在閉包中。
你的代碼可以簡化爲:'jQuery(function($){});' – 2010-12-17 00:16:54
另外,這不是閉包。它只是將一個參數傳遞給一個函數。 – 2010-12-17 00:17:48
@ŠimeVidas:我不同意,任何時候你有一個內在的功能,你有一個閉包。如果代碼中「// ...」是創建一個使用$符號的處理程序,那麼他將通過閉包使用$可用。即使它沒有被使用,也並不意味着它不是封閉的 – 2010-12-17 00:53:45
這不是jQuery代碼,它是JavaScript代碼。 :) – epascarello 2010-12-16 23:57:09