1

在 Javascript 中,如果我们给函数起别名(或者,将“对函数的引用”分配给另一个变量),例如:

f = g;
f = obj.display;
obj.f = foo;

以上所有 3 行,只要右侧的功能/方法不接触,它们就可以工作this?由于我们正在传递所有参数,因此它可能会搞砸的唯一方法是右边的函数/方法使用this?

实际上,如果第 1 行g也是window? 如果g是引用obj.display,则存在同样的问题。

在第 2 行中,当obj.displaytouches时this,表示的是obj,但是当f被调用时,thiswindow,所以它们是不同的。

在第 3 行中,它是相同的:当在's 的代码中f被调用时,则is ,而 while可能用于引用它是否是 的属性。(全局函数)。objthisobjfoothiswindowwindow

所以第2行可以写成

f = function() { obj.display.apply(obj, arguments) }

第 3 行:

obj.f = function() { foo.apply(window, arguments) }

这是正确的方法吗?除此之外还有其他方法吗?

4

3 回答 3

3

基本上是的,但是,在 JavaScript 中,函数是第一类对象,所以它并不是真正的别名。您正在做的是将一个变量的值分配给另一个变量,在这种情况下,该值恰好是一个函数。

然而,这个变量的魔力有点不同。在 JavaScript 中,方法并不像在大多数其他语言中那样绑定到类或对象。当您调用方法时,this由点运算符设置,或者由applycall方法设置。它是这样工作的:

var i = 1;
var f = function () { alert(this.i); }
f(); // in a browser, alerts 1, because this will be window if it isn't anything else.

var obj = { i: 10 };
obj.g = f;
obj.g(); // alerts 10, because the dot binds this to obj

var other_obj = { i: 23 };
f.apply(g); // alerts 23, because now apply binds this to other_obj

您可以使用闭包将方法绑定到对象:

var f = function () { alert(this.i); }
var obj = { i: 10 };

obj.m = function () { f.apply(obj); }
obj.m(); // alerts 10

var g = obj.m;
g(); // alerts 10, because now the closure is called, which binds this correctly.
于 2010-05-06T06:35:36.920 回答
1

“this”的含义和适用于函数的作用域,尤其是回调,似乎是一个经典的 JavaScript “陷阱”。

Dojo 有一个hitch() 方法可以解决这个问题,提供了一种很好的方式来获取回调方法的预期上下文。我想非 Dojo 开发人员可以看看 Dojo hitch() 代码来借鉴这些想法。

本文解释了 this”问题的某些方面以及如何使用 Dojo hitch()。

于 2010-05-06T06:24:35.097 回答
1

如果您以这种方式调用对象,则“this”只会引用函数内的正确对象:

obj.f();

这永远不会起作用,因为 javascript 缺乏对“绑定函数”的支持(不记得方法属于哪个对象):

var x = context.lineTo;
x(10,10);

lineTo 会感到困惑,因为 'this' 现在指向窗口或当前函数对象,而不是其预期的上下文。所以确实,你总是需要申请你的情况。

于 2010-05-06T06:33:10.130 回答