我有一个函数,里面有一些简单的表达式,添加nums,附加doms等。 因为我只需要调用一次,所以匿名函数可以这样做。但是我应该选择哪种方式以及有什么区别?
1:$(document).ready() {})
的简写我看了很多,
$(function(){
var something;
++something;
});
2:在jquery插件中找到。是否绑定到$(document).ready()?
(function ($) {
var something;
++something;
})(jQuery);
答案 0 :(得分:6)
第二个是 绑定到ready
事件。
详细说明。这样:
$(function(){ /* ... */ });
需要定义变量$
。 通常这个变量在加载jQuery时存在并指向jQuery函数。
随后,当您使用函数参数调用jQuery函数时,jQuery会将此函数参数绑定到ready
事件。以上相当于
jQuery(function(){ /* ... */ });
这又是
的便利速记jQuery(document).ready(function(){ /* ... */ });
您的第二个代码段
(function ($) { /* ... */ })(jQuery);
不依赖于$
被定义或指向jQuery()
(如果多个JS框架并行加载,就会发生这种情况)。
要在某个代码区域内仍然方便$
,它会创建一个 $
定义的函数并指向jQuery()
。但是,不绑定到DOM事件。
但这将是:
(function ($) {
$(function(){ /* ... */ });
})(jQuery);
此设置用于最小化JS框架或依赖$
的其他代码段之间的冲突。 jQuery插件作者使用它来编写在许多环境下工作的插件。
如果你认为组合的太复杂,jQuery也有一个速记功能,它可以避免变量冲突并同时绑定到document ready
。但要小心,它只适用于jQuery并且有一些缺点。
jQuery(function($) { /* some code that uses $ */ });
有关详细信息,请参阅以下两篇文章:
答案 1 :(得分:3)
首先
这只是简写
<强>第二强>
您正在使用$
沙箱来减少与使用$
简写的其他库的冲突。
$
只是jQuery
变量的快捷方式,并且被传递到立即调用的函数的内部函数中...
实施例
var outerVar = "something";
(function innerFunc(passedVar) {
passedVar === "something"; //true
})(outerVar);
执行 innerFunc
并将outerVar
作为参数传递。
答案 2 :(得分:2)
在您的第一个示例中,简写形式在功能上与$(document).ready()
相同。
第二个例子是一个立即调用的匿名函数(感谢@Raynos进行更正:这通常被称为自调用函数;它不是一个)。该函数是以jQuery
为参数定义并执行的。这种方法的一个优点是在函数内声明的变量不会“污染”全局(窗口)范围(相反,例如,简单地在函数外部运行该代码)。在您的示例中,something
在函数外部未定义。
由于jQuery
作为参数$
被带入函数,$
保证在该函数体内是jQuery - 即使在其他库正在使用{ {1}}在函数之外。
一个有用的旁注:命名“匿名”函数有时会有所帮助。呃功能保持不变,但名称可以使调试复杂代码变得更加容易。
$
答案 3 :(得分:1)
不,不是,它只是一个简写
不,不是。此代码确保$实际上是jQuery而不仅仅是另一个javascript库
答案 4 :(得分:1)
来自http://docs.jquery.com/Plugins/Authoring:
但是等等!我知道并喜爱的令人敬畏的美元符号在哪里?它的 仍然存在,但要确保您的插件不会发生碰撞 与其他可能使用美元符号的图书馆一样,这是最好的 练习将jQuery传递给自动执行的函数(闭包) 将其映射到美元符号,以便它不会被另一个符号覆盖 库的执行范围。
答案 5 :(得分:0)
只需将两种风格组合在一起。
jQuery(function($) {
// uses the real jQuery as $
// code
});
第一个样式用于在DOM准备就绪时运行一些代码。
第二种风格用于确保$ === jQuery
并使$
成为局部变量(缩短查找时间的一小部分)