代码之家  ›  专栏  ›  技术社区  ›  user372551

jQuery启动

  •  2
  • user372551  · 技术社区  · 15 年前

    在长期使用jquery之后,我有一个问题,我正在使用jquery模式(样式)编写一个简单的代码,

    (function(window, undefined) {
         var jQuery = function (s, c) { ... }
    }) (window);
    

    众所周知,jquery是在一个自执行匿名函数中定义的,我 猜测 它的作用域(jquery)应该局限于匿名函数,但是我们如何在匿名方法之外访问jquery?如果我的假设是错误的…请纠正我。

    我试图编写一个类似于jquery热情的代码,也就是说,用一个匿名方法来包装我的整个代码,比如

    (function( w, u ) {
      var JS = function() { return JS.fn.init();};
    
      JS.fn = JS.prototype = {
         init : function () {
             alert('Initiated');
             return this;
         }
      };
    
    }) (window);
    

    当我试着打电话的时候 JS().init(); 我的Firebug控制台出现了一个错误 JS is not defined . 我哪里出错了?它是由于范围限制还是写得不好?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Anurag    15 年前

    最后,将对象分配给 window 这使得它在匿名功能之外也可以全局使用。

    window.JS = JS;
    

    在jquery的源代码中向 very end 这说明了为什么 jQuery $ 甚至在匿名函数之外定义。

    window.jQuery = window.$ = jQuery;
    

    除了范围,还有其他一些值得注意的事情,

    JS.init() 不存在,因为没有创建新对象。使用创建新对象 init 构造函数函数。

    var JS = function() { return new JS.fn.init(); };
    

    JS() 是的,你不需要再给自己打电话了。要创建新对象,只需使用:

    var foo = JS();
    

    以下是完整的资料来源:

    (function( w, u ) {
        var JS = function() { 
            // create a new object
            return new JS.fn.init();
        };
    
        JS.fn = JS.prototype = {
            init : function () {
                console.log('Initiated');
                return this; // not needed
            }
        };
    
        // link the init constructor with JS.prototype
        JS.fn.init.prototype = JS.fn;
    
        // make globally available
        window.JS = JS;
    
    }) (window);