我对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
所以,哪里是我的“这个”?
“这”是后期绑定。 也就是说,它被绑定到执行函数之前的事情。 它是什么必然取决于你如何调用你的函数。
如果你这样称呼它(功能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。
您可以指定的范围内this
当你通过调用一个方法例如.apply()
或.call()
方法。 在你的情况,像你说的,已经时过境迁。 如果你真的需要进行field
被o.field
,你必须通过定义在使用封闭告诉明确如此,例如method
的方法。
你说的没错它不是有效的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;
}
};