我的'这个'在哪里?使用objects方法作为回调函数

时间:2009-07-06 06:30:31

标签: javascript oop pointers callback

我有一个关于javascript规范或函数指针(委托?)实现的一般性问题,它们是对象方法的指针。

请阅读以下代码段。这里我们有一个对象,使用'this'来访问对象字段。当我们像往常一样调用此方法(o.method();)时,返回对象的指定字段的值。但是当我们创建指向此方法的指针(回调)并调用它时,返回一个未定义的值,因为方法范围内的'this'现在是全局对象。

var o = {
    field : 'value', 
    method : function() {
        return this.field;
    }
};

o.method(); // returns 'value'

var callback = o.method;

callback(); // returns 'undefined' cause 'this' is global object

那么,我的'这个'在哪里?

3 个答案:

答案 0 :(得分:10)

“这个”是后期绑定。也就是说,它在函数执行之前就被绑定了。它的作用取决于你如何称呼你的功能。

如果你称之为(函数调用):

   myfunction();

“this”绑定到全局对象

如果你称之为(方法调用):

   myobject.myfunction();

“this”绑定到“myobject”

你也可以像这样调用它(调用invokation):

   myfunction.call(myobject);

在这种情况下,“this”绑定到myobject

还有(构造函数调用):

 new MyFunction();

其中“this”绑定到一个新构造的空白对象,其原型是MyFunction.prototype。

无论如何,这是javascript的创建者如何谈论它。 (我认为在规范中以这种方式讨论)调用函数的不同方式。

ecmascript标准的新版本(ecmascript5)包括原型库的“bind”方法,该方法返回一个新函数,其中“this”prebound为您指定的内容。例如:

  mynewfunction = myfunction.bind(myobject);
  mynewfunction();

mynewfunction的调用已将“this”绑定到myobject。

答案 1 :(得分:1)

例如,当您通过this.apply()方法调用方法时,可以指定.call()的上下文。在你的情况下,就像你说的那样,背景已经改变了。如果您确实需要fieldo.field,则必须明确说明,例如在定义method方法时使用闭包。

答案 2 :(得分:-1)

你是对的,它不是有效的JavaScript。我正在考虑使用新功能,它允许你有多个实例:


function o2(value) {
    var _this = this;
    this.field = value;
    this.method = function() { 
        return _this.field;
    };
}

var test1 = new o2('blah'); var test2 = new o2('meh');

var callback1 = test1.method; var callback2 = test2.method;

alert(callback1()); alert(callback2());

或者,如果您想继续使用单身,您可以在对象中引用o。

var o = {
    field : 'value', 
    method : function() {
       return o.field;
    }
};