Javascript 我的';这个';?使用objects方法作为回调函数

Javascript 我的';这个';?使用objects方法作为回调函数,javascript,oop,pointers,callback,Javascript,Oop,Pointers,Callback,我有一个关于javascript规范或函数指针(委托?)实现的一般性问题,这些函数是指向对象方法的 请阅读下面的代码片段。这里我们有一个对象,其方法使用“this”访问对象字段。当我们像往常一样调用此方法(o.method();)时,返回对象的指定字段的值。但当我们创建指向该方法的指针(回调)并调用它时,返回一个未定义的值,因为该方法范围内的“this”现在是全局对象 var o = { field : 'value', method : function() {

我有一个关于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

因此,我的“this”在哪里?

您可以指定
this
的上下文,例如,当您通过
.apply()
.call()
方法调用方法时。就你而言,就像你说的,情况已经改变了。如果您确实需要将
字段
设为
o.field
,则必须明确说明这一点,例如,在定义
方法
方法时使用闭包。

“此”是后期绑定。也就是说,它在函数执行之前绑定到一个对象。它所绑定的内容取决于如何调用函数

如果您像(函数调用)一样调用它:

“this”绑定到全局对象

如果您像(方法调用)一样调用它:

“this”绑定到“myobject”

您也可以这样调用它(调用调用):

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

还有(构造函数调用):

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

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

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

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

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

没错,它不是有效的javascript。我正在考虑使用新函数,它允许您拥有多个实例:


谢谢,我知道这个。但我想知道为什么内容发生了变化。这是javascript作者设计的吗?这与事实最为相似。这篇文章解释了我的问题——这不是有效的JavaScript。
   myobject.myfunction();
   myfunction.call(myobject);
 new MyFunction();
  mynewfunction = myfunction.bind(myobject);
  mynewfunction();

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());
var o = {
    field : 'value', 
    method : function() {
       return o.field;
    }
};