首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

求大神帮忙看一下JS,该怎么解决

2013-04-26 
求大神帮忙看一下JS(function (window, $, undefined) {if (!$) { console.log(FQfast缺少jQuery依赖!)

求大神帮忙看一下JS
(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了。头有点儿晕了,求大神解释一下。


--------------------------------------------
javascript jquery 扩展
[解决办法]
第一次执行的是Dialog方法,所以alert了测试

第二次执行的是alert(FQfast.Dialog());你这个方法没有返回值,所以alert了undefined;
[解决办法]
window.FQfast = FQfast();这句应该改成window.FQfast = FQfast;吧

[解决办法]
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

不知道你明白没?
[解决办法]

引用:
引用:window.FQfast = FQfast();这句应该改成window.FQfast = FQfast;吧
也就是说我extend的那个this;不是FQfast.fn而是FQfast是吧?


是的。函数里的this指向调用者。

所以你如果写成FQfast.fn.extend({Dialog:function(){..}}),this指向的就是FQfast.fn。

这样最终你在window下面就可以直接访问到。

或者你像3楼说的那样,返回不用改上面的FQfast.extend({Dialog:function(){..}})也可以调用到Dialog方法

热点排行