Javascript I';我想了解jQuery插件的语法

Javascript I';我想了解jQuery插件的语法,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,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('nor

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所做的任何语法。下面是我的问题列表:

  • 如果替换函数($)。。。对于一个变量,如“theu function”,语法如下所示:

     (the_function)( jQuery );
    
    (jQuery);“在做什么?”?_函数周围的括号真的有必要吗?他们为什么在那里?有没有其他类似的代码

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

  • 谢谢你的帮助


    (function( $ ){
    
    })( jQuery );
    
    这是一个自动执行的匿名函数,它在参数中使用
    $
    ,这样您就可以在该函数中使用它(
    $
    ),而不用担心与其他库冲突,因为在其他库中
    $
    也有特殊的含义。这种模式在编写jQuery插件时特别有用

    您可以在此处写入任何字符,而不是
    $

    (function(j){
      // can do something like 
      j.fn.function_name = function(x){};
    
    })(jQuery);
    
    在这里,
    j
    将自动赶上末尾指定的jQuery
    (jQuery)
    。或者,您可以完全省略参数,但是您必须在所有地方使用
    jQuery
    关键字,而不是
    $
    ,而不必担心冲突。因此,
    $
    被包装在速记参数中,这样您就可以在该函数中编写
    $
    而不是
    jQuery

    如果您查看jQuery的源代码,就会发现所有内容都包含在以下两个方面:

    (function( window, undefined ) {
      // jQuery code
    })(window);
    
    这也是一个带有参数的自动执行匿名函数。将创建一个
    窗口
    (和
    未定义
    )参数,并将其映射到底部的全局
    窗口
    对象
    (窗口)
    。这是目前流行的模式,速度几乎没有提高,因为这里的
    window
    将从参数中查看,而不是从下面映射的全局
    window
    对象中查看


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


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

    您还可以查看本文,了解更多关于我编写的自动执行函数的信息:


    基本插件语法允许您使用
    $
    引用插件主体中的
    jQuery
    ,而不管加载插件时的
    $
    标识如何。这可以防止与其他库(尤其是原型库)的命名冲突

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


    这也有助于不污染全局名称空间(因此在插件主体中声明
    var myvar=123;
    不会突然定义
    window.myvar
    ),但表面上的主要目的是允许您使用
    $
    ,其中
    $
    可能已经被重新定义。

    最后的jQuery会自动通过(jQuery)转到函数,以便您可以在插件中使用$符号。你也可以

    (function(foo){
    
      foo.fn.myPlugin = function() {
    
    
        this.fadeIn('normal', function(){
    
    
        });
    
      };
    })( jQuery );
    

    您正在处理一个自调用匿名函数。将jQuery插件封装在这样一个函数中,以确保
    $
    符号绑定到
    jQuery
    对象,这类似于“最佳实践”

    例如:

    (function(foo) {
        alert(foo);
    }('BAR'));
    
    当放入
    块时,这将向
    条发出警报。参数
    BAR
    被传递给调用自身的函数

    同样的原理也发生在代码中,
    jQuery
    对象被传递给函数,因此
    $
    肯定会引用jQuery对象

    function(x){ 
        x...
    }
    
    它只是一个没有名字的函数,只接受一个参数“x”,并使用x进行操作

    您可以使用$,而不是“x”,它是一个常用的变量名,但它仍然是合法的

    function($){ 
        $...
    }
    
    我将把它放在括号中,以确保它解析为表达式:

    (function($){
        $....
    })
    
    要调用函数,可以在函数后面加上()和一系列参数。例如,如果我们想调用此函数,将值
    $
    传入3,我们将执行以下操作:

    (function($){
        $...
    })(3);
    
    为了方便起见,让我们调用此函数并将jQuery作为变量传入:

    (function($){
         $....
    })(jQuery);
    
    这将创建一个新函数,该函数接受一个参数,然后调用该函数,并将jQuery作为值传入

    为什么?

    • 因为每次想用jQuery做点什么的时候都要编写jQuery是一件乏味的事情
    为什么不直接编写
    $=jQuery

    • 因为其他人可能会将$定义为其他含义。这保证了$的任何其他含义都会受到此含义的影响

    要清楚地解释这一点以及其他现代javascript技巧和常见做法,我建议阅读javascript Garden


    它特别有用,因为其中许多模式在许多库中被广泛使用,但没有得到真正的解释。

    这里的其他答案很好,但有一个重要的问题尚未解决。你说:

    所以它正在创建一个函数,据我所知,它永远不会运行,参数$,已经定义好了

    不能保证全局变量
    $
    可用。默认情况下,jQuery在全局范围内创建两个变量:
    $
    jQuery
    (这两个变量是同一对象的别名)。然而,<
    <script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
      jQuery.noConflict();
    </script>