【发布时间】:2011-02-16 06:08:58
【问题描述】:
在 Javascript 中,如果我们为一个函数起别名(或者,将“对函数的引用”分配给另一个变量),例如:
f = g;
f = obj.display;
obj.f = foo;
以上所有 3 行,只要右侧的函数/方法不触及this,它们就可以工作?由于我们要传入所有参数,因此唯一可以搞砸的方法是右边的函数/方法使用this?
实际上,如果g 也是window 的属性,那么第1 行可能没问题?如果g 引用了obj.display,那么就会出现同样的问题。
在第2行中,obj.display接触this时,表示obj,但调用f时,this是window,所以它们是不同的。
在第 3 行中,也是一样的:当在 obj 的代码内部调用 f 时,则 this 是 obj,而 foo 可能使用 this 来引用window 如果它是 window 的属性。 (全局函数)。
所以第2行可以写成
f = function() { obj.display.apply(obj, arguments) }
和第 3 行:
obj.f = function() { foo.apply(window, arguments) }
这是正确的方法吗?除此之外还有其他方法吗?
【问题讨论】:
-
这让我想到了 M.C.锤子
-
我知道。我试图在原始问题中不提及这一点。
-
恭喜,您刚刚发现了我讨厌 Javascript 中的面向对象编程的原因。由于缺少绑定函数,您始终必须注意上下文以及(因此) this 指向的内容。现在您可以继续学习真正的 OOP 语言了(抱歉 :)。
标签: javascript binding call apply