(function (window, $, undefined) {
    if (!$) { console.log("FQfast缺少jQuery依赖!"); return; }
    var FQfast = function () {
        return FQfast.fn.init();
    };    FQfast.fn = FQfast.prototype = {
        init: function () {
            return this;
        }
    };
    // 添加扩展方法
    FQfast.extend = FQfast.fn.extend = function () {
        console.log("extend");
        var options, name, src, copy,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length;
        if (length == 1) {
            target = this;
            i--;
        }
        for (; i < length; i++) {
            if ((options = arguments[i]) != null) {
                for (name in options) {
                    src = target[name];
                    copy = options[name];
                    if (src === copy) {
                        continue;
                    }
                    if (copy !== undefined) {
                        target[name] = copy;
                    }
                }
            }
        }
        return target;
    }
    FQfast.extend({
        Dialog: function () { alert("测试"); },
    });
    alert(FQfast.Dialog());
    // 将框架变量 -> window
    console.log("window");
    window.FQfast = FQfast();
})(window, $);
最近在研究jQuery的源码,想自己理解一下,然后写着玩。我发现在匿名方法内部调用FQfast.extend()是无效的,只有放在外面,我很是不解,然后就加了一个alert(FQfast.Dialog());测试一下,发现,竟然被调用了两次,第一次弹出的是“测试”,第二次就undefind了。头有点儿晕了,求大神解释一下。
--------------------------------------------------------------------------------
javascriptjquery扩展

解决方案 »

  1.   

    第一次执行的是Dialog方法,所以alert了测试第二次执行的是alert(FQfast.Dialog());你这个方法没有返回值,所以alert了undefined;
      

  2.   


    对对对,是这样的,可以我在外面使用这个FQfast.Dialog()方法为什么不行呢?大神帮忙看一下,
      

  3.   

    window.FQfast = FQfast();这句应该改成window.FQfast = FQfast;吧
      

  4.   

    window.FQfast = FQfast();
    这句调用FQfast.fn.init(),最终
    init: function () {
        return this;//这里的this是FQfast.prototype
    }
    返回的是FQfast.prototype,而你FQfast.extend({
            Dialog: function () { alert("测试"); },
        });只是给FQfast添加了Dialog,而不是给FQfast.prototype添加了Dialog不知道你明白没?
      

  5.   

    我在extend方法里面用的就是this啊。
      

  6.   

    也就是说我extend的那个this;不是FQfast.fn而是FQfast是吧?
      

  7.   


    是的。函数里的this指向调用者。所以你如果写成FQfast.fn.extend({Dialog:function(){..}}),this指向的就是FQfast.fn。这样最终你在window下面就可以直接访问到。或者你像3楼说的那样,返回不用改上面的FQfast.extend({Dialog:function(){..}})也可以调用到Dialog方法