【问题标题】:assigning function to variables and assigning variables to functions(?) in Javascript在Javascript中将函数分配给变量并将变量分配给函数(?)
【发布时间】:2013-02-26 23:17:07
【问题描述】:

我正在通过剖析我以前使用过的其他人编写的一些脚本来学习 javascript(* 对此至关重要!)。这段代码(我从中间剪掉了很多,以使代码更易于阅读,所有 cmets 都是我的)来自 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 这条线让我很困惑。看起来这可能是一些命名空间的魔法。

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

谢谢

【问题讨论】:

  • 老实说,你需要一个好的 Javascript 入门,但并不完全。让我在 10 分钟内向你推荐 Spencer Tippings 的 Javascript
  • javascript 中没有“命名空间”,只有对象属性。您需要将它们与变量区分开来。
  • @Bergi:你是对的,当然。我在想“范围”,但写了“命名空间”
  • @NannuoLei:感谢您的参考。它看起来确实是一个很好的资源。

标签: javascript function var


【解决方案1】:

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

var trigger = t.trigger 所做的是在EventManager 函数的范围内声明一个名为trigger 的变量。在较低范围内定义了其他函数,即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;

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

【讨论】:

  • 这是一个很好的解释。谢谢!我并没有考虑较低的范围。现在我明白为什么作者称第一种类型“出口”和第二种类型“进口”。
【解决方案2】:

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

【讨论】:

  • this 既不是变量,也不太可能引用全局对象——那些函数是构造函数。
  • 请注意The variable this references the context the function was called in 不正确。函数的this 参数的值可以是任何值(在严格模式下)或任何对象。它完全由调用设置,完全独立于调用的执行上下文。