关于jquery闭包的一个简单问题
这是什么意思?
(function($){ })(jQuery);
为了使问题更清楚,在括号中包含函数的含义在JS中是什么意思(对不起,我对闭包的概念有点困惑)。 $参数怎么样? 和最后括号中的“jQuery”?
我可以用mootools做同样的事情并将它们合并到1个JS文件中吗?
(function($){})(jQuery); (function($){})(mooTools);
我只与jquery合作,并计划与Mootools合作
在括号之间包装函数可确保将此函数作为函数表达式进行求值。
这是因为分组运算符 (括号)只能计算表达式 。
如果没有使用括号,它将被解释为函数声明 ,并且它将导致语法错误,因为函数名称对于函数声明不是可选的。
(function(arg){ alert(arg); // alerts test })("test");
在上面的示例中,函数表达式自动执行,并传递参数。
jQuery插件大量使用该模式,因为jQuery可以在noConflict模式下运行,不会创建$
global变量,因此jQuery全局对象作为此匿名函数的参数传递,在该函数内部,您可以自由引用它作为$
(收到的论据)。
请记住,在上面的示例中调用的自执行函数表达式中的函数上下文( this
关键字)也将始终引用Global对象。
有关函数表达式和函数声明之间差异的更深入信息,请查看以下资源:
- 解释JavaScript封装的匿名函数语法
- 命名函数表达式揭秘
CMS给了你正确的答案,但我只想补充一点,这不是一个闭包。 这只是用于返回表达式结果的()运算符,在本例中是一个函数表达式,并且在javascript中,可以直接调用返回的匿名函数。 所以这只是两者结合:
var x = (1+1); // <-- () evaluates an expression
和:
var arr = [0,1,2]; arr.push(function(text){alert(text)}); arr[3]('hello'); // <-- function returned by array called directly
至于$参数,这只是javascript允许变量名称的一个字符。 您的示例完全相同于:
(function(jQ){})(jQuery); (function(moo){})(mooTools);
这样做的要点是,在函数表达式中创建的对象可以从附加到传入对象的属性和方法中使用,而不公开公开这些对象。 这有助于防止可变碰撞。 它还允许创建的变量作为附加任何内容的私有存储进行访问。
(函数($){ // jQuery在这里可以作为$
var myPrivateArray = []; //这是私人的
$ .addItem = function(item){ myPrivateArray.push(项目); }
})(jQuery的);
//我在这里无法访问myPrivateArray
//但我可以使用jQuery.addItem来添加内容。
这是关于闭包的文章: http : //www.jibbering.com/faq/faq_notes/closures.html
基本上,正如CMS所说,它是一个函数表达式。 有一个完美的例子可以帮助您更好地了解该页面的2/3。
最后一组括号中的jQuery意味着你将jQuery对象传递给内部函数。 该内部函数接受对象,并将其指定为$
。 因此,当您访问函数内部的$
,您实际上正在对您传递的jQuery对象进行操作。
至于将它们与jQuery和Mootools混合使用,我从未使用过Mootools,所以我不确定它是如何分配的。 我唯一想到的是,如果它像jQuery一样使用$
,你可以调用jQuery.noConflict();
并将jQuery重新分配给另一个变量,也许var $j = jQuery;
然后,您可以像往常一样使用Mootools。
function($) { ... }
创建一个接受名为$
的参数的函数。
括号括起来什么也没做。
添加(jQuery)
使用jQuery
作为参数调用该函数。
这样做是为了使函数在全局范围内独立于$
。
当你在函数中写$
时,你指的是参数 $
,而不是全局变量$
。
命名空间$的mootools是:
(function($) { // $ is the mootools one (aliasing document.id) })(document.id);
您可以将它们组合成一个文件,但请记住,mootools是一个原型框架,$仅用于选择器的目的,而所有函数都进入元素/数组/类等原型。 因此在mootools工作中这样做:
var foo = $("bar"); foo.hide(); // the element inherits .hide()
但在jquery中它会失败并需要转录为
var foo = $("#bar"); $(foo).hide();
关键是,你不能将mootools导出的东西命名为原型。