2010-12-16 65 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