需要帮助破译JQuery示例吗

需要帮助破译JQuery示例吗,jquery,Jquery,我刚开始学习jQuery和oojavascript,所以我试图弄清楚哪个属于哪个,它们做什么。我在JQuery文档中发现了这段代码 (function($sub) { $sub // a subclass of jQuery $sub === jQuery; //= false $sub.fn.myCustomMethod = function(){ return 'just for me'; } $sub(document).ready(function()

我刚开始学习jQuery和oojavascript,所以我试图弄清楚哪个属于哪个,它们做什么。我在JQuery文档中发现了这段代码

(function($sub) {

  $sub // a subclass of jQuery
  $sub === jQuery; //= false

  $sub.fn.myCustomMethod = function(){
    return 'just for me';
  }

  $sub(document).ready(function() {
    $sub('body').myCustomMethod(); //= 'just for me'
  });

})(jQuery.subclass());
问题:

  • 为什么(函数)被()包围
  • 这是什么意思(jQuery.subclass());?这是jQuery的东西还是常规javascript的一部分
  • 谢谢(1)自调用函数

    function() {
    
    }();
    
    它们本身都是无效的,因为它们会导致语法错误,而且在底部调用它会让人感到困惑

    这就是为什么JavaScript社区在自调用函数开始时使用
    )让代码的其他读者知道它不是一个正常的函数

    var o = (function() {
    
    })();
    
    每当我看到以
    开头的函数时,我知道它是自调用的。这意味着它会立即执行,
    o
    包含函数的返回值,而不是函数

    var o = (function() {
    
    })();
    
    (2)jQuery子类

    function() {
    
    }();
    
    小心使用子类依赖于jQuery1.5。我建议您等待正式发布,而不是使用1.5RC1,因为还有一些bug需要解决

    jQuery.subclass
    是jquery1.5测试版的一部分。它是jQuery的一个新特性,本质上是jQuery的一个子类

    这意味着您添加到的任何内容都不会添加到jQuery。jQuery子类具有jQuery的所有功能,但您添加或更改的任何内容都不会影响“全局jQuery”

    注释样本源

    // self invoking function. This creates a closure so that anything declared in 
    // this function is local and doesn't effect global state
    (function($sub) {
    
      $sub // a subclass of jQuery
      $sub === jQuery; //= false
    
      // here we extend $.fn with a new method. This actually extends the prototype of $sub
      // $sub.fn === $sub.prototype === $()
      // $sub.fn is actually a new jQuery object. This means that when using $sub we first look
      // for method defined on $sub.fn, and if there aren't any we look on methods defined 
      // on $.fn. A useful feature of this is that you can overwrite methods
      $sub.fn.myCustomMethod = function(){
        return 'just for me';
      }
    
      // We can "overwrite" methods of jQuery by hiding the original methods.
      $sub.fn.attr = function() {
        alert("new attr!");
        // you can go into $sub.superclass to get the original $ object and call methods there
        $sub.superclass.attr.apply(this, arguments);
    
      }
    
      // This calls .ready from the original jQuery
      $sub(document).ready(function() {
        $sub('body').myCustomMethod(); //= 'just for me'
      });
    
    // we pass in a subclass of jquery at the bottom. This means that $sub has all the
    // functionality of $ but doesn't change $ itself. 
    })(jQuery.subclass());
    
    免责声明
    \uuuuu proto\uuuuuu
    已弃用且不正确。它仅用于说明jQuery.subclass的原型链的外观

    对于那些理解的人(这会得到对象构造函数的原型)

    如果需要进一步的解释,或者如果你对其他事情感到好奇,请一定要提出来。我可能掩盖了一些我认为很明显的事情

  • 它是一个返回匿名函数的表达式。使用jQuery.subclass()作为单个参数立即调用生成的函数(第二对括号)
  • 这是一个jQuery类。它允许您创建一个“自定义”jQuery类,同时仍保留未更改的jQuery供页面上的其他脚本使用()
  • 我会尽力解释的

  • 函数被()包围,因为这是创建函数的方式。()中的代码对于全局作用域(窗口)将不可见。该代码使用一个参数创建匿名函数,并在声明后立即调用该函数,并将jQuery.subclass()作为函数参数传递
  • 例如:

    函数dirty($arg){…}
    在全局范围内可见

    (function dirty($arg){…})(“some arg”);
    在全局作用域中不可见-它使用自己的作用域创建一个函数,并立即调用它,如果它没有分配给变量,则引用将丢失

    通过这种方式,您可以在不更改全局jQuery对象的情况下更改jQuery的函数 2.从jQuery API文档中-

    创建jQuery的子类 对象,允许您添加其他 或者修改jQuery方法和 属性而不影响 全局jQuery


    @Goleztroll从技术上讲,表达式返回调用函数的值,因为外圆括号在调用后结束。不,它不返回。括号中只包含函数声明。括号在函数结束后关闭。您的第1点是错误的。
    ()
    不创建闭包。关键是使语句有效并使读者意识到它是自调用的。例如,它在全局范围中不可见是因为它是一个函数表达式而不是一个声明。它与闭包无关。除非输入新的函数块,否则不会创建新的范围将jQuery扩展为子类这允许您在本地覆盖jQuery方法,而不影响页面上的其他代码。是的,()用于生成有效语句,但整个过程是一个闭包(我使用的闭包定义是函数加上函数作用域中所有定义的变量)函数($arg){..})($arg)stuff用于从全局范围隐藏内容。