我想了解 jQuery 插件语法

IT技术 javascript jquery jquery-plugins
2021-03-05 22:56:07

jQuery 站点列出了 jQuery 的基本插件语法,如下所示:

(function( $ ){    
  $.fn.myPlugin = function() {      
    // there's no need to do $(this) because
    // "this" is already a jquery object

    // $(this) would be the same as $($('#element'));

    this.fadeIn('normal', function(){    
      // the this keyword is a DOM element    
    });    
  };
})( jQuery );

我只是想从 Javascript 的角度了解那里发生了什么,因为它看起来不像我以前见过的 JS 那样遵循任何语法。所以这是我的问题清单:

  1. 如果将 function($)... 替换为变量,例如“the_function”,则语法如下所示:

     (the_function)( jQuery );
    

    什么是“(jQuery);” 正在做?the_function 周围的括号真的有必要吗?他们为什么在那里?您是否可以提供另一段类似的代码?

  2. 它以 function( $ ) 开头。所以它正在创建一个函数,据我所知永远不会运行,参数 $ 已经定义?发生什么事了?

谢谢您的帮助!

6个回答
function(x){ 
    x...
}

只是一个没有名字的函数,它接受一个参数“x”,并用 x 做一些事情。

您可以使用 $,而不是常见的变量名 'x',这是一个不太常见的变量名,但仍然合法。

function($){ 
    $...
}

我会将它放在括号中以确保它解析为表达式:

(function($){
    $....
})

要调用一个函数,你可以在它后面加上一个参数列表 ()。例如,如果我们想调用这个函数,传入 3 的值,$我们会这样做:

(function($){
    $...
})(3);

只是为了踢球,让我们调用这个函数并将 jQuery 作为变量传入:

(function($){
     $....
})(jQuery);

这将创建一个新函数,该函数接受一个参数,然后调用该函数,并传入 jQuery 作为值。

为什么?

  • 因为每次你想用 jQuery 做某事时都编写 jQuery 是乏味的。

为什么不直接写$ = jQuery

  • 因为其他人可能已经将 $ 定义为其他含义。这保证了 $ 的任何其他含义都被这个含义所掩盖。
我遇到了一个代码示例,恕我直言,上面的列表中没有包括: $(function () { ..... }(jQuery)); (取自此处:docs.microsoft.com/en-us/aspnet/core/mvc/models/...)。在这里,我不明白 $ 的用法。它似乎不是 jQuery 选择器 $(...) 或 'document ready' 事件的简短语法,因为该函数不返回任何内容。我似乎也不是将函数视为表达式的前缀,因为它在大括号之外。此外,函数调用是在大括号内进行的,所以我们调用了声明。
2021-04-24 22:56:07
(function($, win, doc){ $.... })(jQuery, window, document); 我也会添加这个...它帮助我更好地理解。在这个和平的代码中,jQuery ---> $; 和窗口--->胜利;然后文档 ---> 文档... :) 谢谢...
2021-04-29 22:56:07
很清楚,但它没有详细说明需要引导解析器将函数定义解析为expression而不是statement这就是额外括号的用途。
2021-05-07 22:56:07
(function(){})()被称为IIFE(立即调用函数表达式)让大家知道,你可以用其他符号来强制解析器处理函数作为表达式,比如+,!,-,~像这(和其他人): !function($){}(jQuery)为了获得更多乐趣,您可以:~~+-!function($){}(jQuery)
2021-05-11 22:56:07

(function( $ ){

})( jQuery );

这是$在参数中使用的自执行匿名函数,因此您可以使用它 ( $) 而不是jQuery在该函数内部,并且不必担心与其他库发生冲突,因为在其他库中也$有特殊含义。这种模式在编写 jQuery 插件时特别有用。

你可以在那里写任何字符而不是$太:

(function(j){
  // can do something like 
  j.fn.function_name = function(x){};

})(jQuery);

这里j会自动追上 jQuery 指定的末尾(jQuery)或者您可以完全省略参数,但是您将不得不jQuery到处使用关键字,而不是$仍然不必担心碰撞。So$包含在简写的参数中,以便您可以在该函数内部编写$而不是在jQuery周围编写

如果您甚至查看 jQuery 的源代码,您会发现所有内容都包含在它们之间:

(function( window, undefined ) {
  // jQuery code
})(window);

也可以看出这是一个带参数的自执行匿名函数。一个window(and undefined) 参数被创建并映射window到底部的全局对象(window)这是近来流行的模式并且几乎没有速度增益,因为这里window将从参数而不是window下面映射的全局对象中查看


$.fn是 jQuery 的对象,您可以在其中创建新函数(它也是一个对象)或插件本身,以便 jQuery 将您的插件包装在其$.fn对象中并使其可用。


有趣的是,我在这里回答了类似的问题:

JavaScript / jQuery 闭包函数语法

您还可以查看这篇文章以了解有关我编写的自执行函数的更多信息:

Javascript 自执行函数

因此,如果我有一个名为 my_object 的对象,并执行以下操作:(function(mo){mo.doSomething()})(my_object),那么它会运行 my_object.doSomething()?
2021-04-30 22:56:07

基本插件语法允许您在插件正文中使用$来引用jQuery,而不管$插件加载时的标识这可以防止与其他库的命名冲突,尤其是 Prototype。

语法定义了一个函数,它接受一个已知的参数,$因此您可以$在函数体中引用它,然后立即调用该函数,将其jQuery作为参数放入

这也有助于不污染全局命名空间(所以宣布var myvar = 123;在你的插件的身体会不会突然定义window.myvar),但主要的表面目的是让你使用$,其中$可能从此被重新定义。

您正在处理那里的自调用匿名函数。将 jQuery 插件包装在这样的函数中以确保$符号绑定到jQuery对象就像“最佳实践”

例子:

(function(foo) {
    alert(foo);
}('BAR'));

这会BAR在放入<script>时发出警报参数BAR传递给调用自身的函数。

同样的原理发生在你的代码中,jQuery对象被传递给函数,所以$肯定会引用 jQuery 对象。

我明白这一切。我想知道的是为什么/如何使用括号语法来创建自执行函数?这只是语言的一个特性吗?它是如何工作的?
2021-05-04 22:56:07

最后的 jQuery 将自身 (jQuery) 传递给函数,以便您可以在插件中使用 $ 符号。你也可以这样做

(function(foo){

  foo.fn.myPlugin = function() {


    this.fadeIn('normal', function(){


    });

  };
})( jQuery );