Javascript 什么';内联函数调用的好处是什么?
我看到了这段代码(显然是在jQuery中,经过修改) 虽然我理解在内联函数调用中包装代码可以清楚地定义变量范围,但我不理解Javascript 什么';内联函数调用的好处是什么?,javascript,jquery,Javascript,Jquery,我看到了这段代码(显然是在jQuery中,经过修改) 虽然我理解在内联函数调用中包装代码可以清楚地定义变量范围,但我不理解 使用参数传递窗口,而不是直接使用它 通过未定义的参数获取未定义的实例,以及 通过另一个内联函数调用的返回值定义jQuery。 有人能解释一下吗 编辑更清楚地写#3: 我的理解是,代码在另一个函数中定义jQuery,然后返回它 //(function(window,undefined){ var jQuery=(function(){ // Inside this
窗口
,而不是直接使用它实例,以及
jQuery
。
有人能解释一下吗编辑更清楚地写#3: 我的理解是,代码在另一个函数中定义
jQuery
,然后返回它
//(function(window,undefined){
var jQuery=(function(){
// Inside this function defines jQuery and return it?
var jQuery=function(selector,context){
return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
return jQuery;
})(); // This executes the inline function and assign `jQuery` with the return value???
//... })(window);
这更像是如下所示:
function define_jQuery(){
// Inside this function defines jQuery and return it?
var jQuery=function(selector,context){
return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
return jQuery;
}
//(function(window,undefined){
var jQuery=define_jQuery(); // This executes the inline function and assign `jQuery` with the return value???
//... })(window);
这样做不是更简单吗:
//(function(window,undefined){
var jQuery=function(selector,context){
return new jQuery(selector,context); //simplified
};
jQuery.xxx=xxx;
//...
//... })(window);
将
window
作为一个参数进行传递会使所有的问题都变得更糟,这是一种空间浪费:它是一个对象,因此通过引用进行传递。对闭包内部的窗口
所做的任何更改都将影响与外部相同的实例
获取未定义的
参数对于那些愚蠢到可以命名实际变量未定义的
的人来说是一种对策(在较新的浏览器中无论如何都不能这么做)
据我所知,第二个内联函数完全没有意义,除非在定义
jQuery
属性的过程中使用临时变量。分别回答以下问题:
窗口
?因为在JavaScript中取消引用变量是痛苦的。传入一个实例意味着您不必这样做。通常,该机制如下所示:
(function (window, document, $) {
}(window, window.document, jQuery));
在这种情况下,无需转到全局范围来取消对这三个变量中任何一个的引用(jQuery可以在.noConflict()
中启动)undefined=2代码>。我承认这很愚蠢,但这是可能的。但是,如果在函数中接受的参数多于传递的参数,则可以确信它确实是未定义的,而不是它的黑客副本
$('#sel').func1().func2()
。这是可能的,因为func1可能看起来像这样:
jQuery.fn.func1 = function () {
return $(this).each(function () {
// do something fabulous
};
};
return$(this).bla_de_bla()
是以下的缩写:
$(this).bla_de_bla(..);
return $(this);
它还假定.bla_de_bla()也返回$(this)
编辑:修改了#3,以注意它最擅长链接,而不是围绕
.noConflict()
和错误命名$
关于“窗口”参数的漂亮部分不是取消引用。如果在一个实例中传入“window”,在另一个实例中传入window.parent(想想子窗口控制父窗口的高级功能,duh!!!)
JQuery总是比我聪明一点(我通常会找到隐藏的线索!)。一个原因是代码缩小。缩微器不能收缩全局名称,因为它们不再引用全局对象。通过传入您正在使用的所有对象,它们将成为本地对象。这样可以缩小对
窗口
和未定义
的数千个引用。你好,应该会有帮助<代码>:)我写了第3条,让它更清楚,你能检查一下吗?里面有一些很好的巫毒故事,一些很聪明的人比我们都聪明。我从来没有像它们那样需要嵌套jQuery定义,而查看您刚才引用的代码确实让我很难眯起眼睛。一些jQuery
s是指向“原始jQuery”(如果您之前定义了它)的指针,一些指向“我们正在构建的jQuery”,一些指向“您所做的选择”。在其他条件相同的情况下,我宁愿他们有更具描述性的名字。真正优雅的是jQuery.fn
是jQuery.prototype
的缩写。为了让它更清楚,我重新编写了#3,你能检查一下吗?
$(this).bla_de_bla(..);
return $(this);