哪里是我的“这个”? 使用对象方法的回调函数(Where is my 'this'

2019-06-25 02:35发布

我对JavaScript的规范或实现的功能指向一个通用的问题(代表?),它是指向对象的方法。

请阅读下面的代码片段。 下面我们就用“这个”访问对象场的方法的对象。 当我们称这种方法照常( o.method(); ),则返回该对象的指定字段的值。 但是,当我们创建指向这个方法(回调),并调用它,返回一个未定义的值,因为“这个”内法的范围是现在全局对象。

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

所以,哪里是我的“这个”?

Answer 1:

“这”是后期绑定。 也就是说,它被绑定到执行函数之前的事情。 它是什么必然取决于你如何调用你的函数。

如果你这样称呼它(功能invokation):

   myfunction();

“这个”被绑定到全局对象

如果你这样称呼它(方法invokation):

   myobject.myfunction();

“这个”被绑定“的MyObject”

你也可以把它像这样(电话invokation):

   myfunction.call(myobject);

在这种情况下“本”被绑定到MYOBJECT

也有(构造函数invokation):

 new MyFunction();

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

这是JavaScript的创造者是如何谈论它,反正。 (我认为这是讨论这样的规范)调用函数的不同方法。

ECMAScript标准(ecmascript5)的新版本包括原型库的“绑定”方法,它会返回“这个”预绑定到你指定的东西了新的功能。 例如:

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

mynewfunction的invokation有“本”已经绑定到MYOBJECT。



Answer 2:

您可以指定的范围内this当你通过调用一个方法例如.apply().call()方法。 在你的情况,像你说的,已经时过境迁。 如果你真的需要进行fieldo.field ,你必须通过定义在使用封闭告诉明确如此,例如method的方法。



Answer 3:

你说的没错它不是有效的JavaScript。 我在考虑使用新的功能,可以让你有多个实例:

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

VAR = TEST1新O2( '等等'); VAR = TEST2新O2( 'MEH');

VAR调用callback1 = test1.method; VAR callback2 = test2.method;

警报(调用callback1()); 警报(callback2());

另外,如果你想继续使用,你可以从Ø对象中引用一个单例。

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


文章来源: Where is my 'this'? Using objects method as a callback function