2

我通过剖析我以前使用过的其他人编写的一些脚本来学习 javascript(stackoverflow 对此至关重要!)。这段代码(我从中间删减了很多,以使代码更易于阅读,所有注释都是我的)来自fullCalendar.js,一个 jquery 插件。

我不确定作者在这里做什么:

function EventManager(options, _sources) { //called using .call()
    var t = this;

    t.isFetchNeeded = isFetchNeeded;  //?? assign the function "isFetchNeeded" to the variable (not the value returned by the function)??

    var trigger = t.trigger;    //?? namespace??
}

function View(element, calendar, viewName) {
    var t = this;   

    function trigger(name, thisObj) {
        return calendar.trigger.apply(
                 calendar,
                 [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t])
        );
    }
}

首先,我的猜测是this.foo=bar将函数“bar”分配给当前对象中名为“isFetchNeeded”的变量(还不知道为什么要这样做。速度?)。

其次,这条线var foo=this.bar把我难住了。看起来它可能是一些命名空间的魔法。

我对第一行的思考是否正确?下一行在做什么?

谢谢

4

2 回答 2

1

this.foo = barbar(无论它可能是)的值分配给名为 的对象的成员foo。这确实可以是一个函数定义以及许多其他东西。

什么var trigger = t.trigger是声明一个在函数trigger范围内命名的变量。EventManager在较低范围内定义了其他函数,即pushLoadingpopLoading。这些不是对象成员,因此this.trigger在这些函数内部使用是行不通的。该var trigger声明使其可以在这些函数中访问。

我并没有声称自己是有史以来最好的 JS 程序员,所以我不能说他的所作所为是否有意义,但你可以看到EventManager.js实际使用的方式(在 中Calendar.js):

EventManager.call(t, options, eventSources);
var isFetchNeeded = t.isFetchNeeded;
var fetchEvents = t.fetchEvents;

他实际上并没有创建一个EventManager对象,但是他用这个Calendar对象调用了它的构造函数。 Calender 确实trigger定义,这就是为什么var trigger = t.triggerEventManager. 同样,该行

var isFetchNeeded = t.isFetchNeeded;

InCalendar.js获取isFetchNeeded方法“退出”EventManager并允许在Calendar范围内调用它。

于 2013-02-26T23:40:39.100 回答
0

变量this引用调用函数的上下文。在这种情况下(假设代码在 Web 浏览器中运行)是window对象。第一行简单地将函数分配为对象isFetchNeeded的方法。this第二行将this's 成员变量的值分配trigger给函数的局部变量EventManager

于 2013-02-26T23:29:31.507 回答