我在MooTools(1.3)类中使用this
关键字时遇到了困难。构造函数为属性赋值,随后运行的方法在alert
弹出窗口中显示该值。如果我想延迟运行此方法(使用myfunction.delay(…)
),弹出窗口会显示undefined
。
var MyClass = new Class({
initialize: function() {
this.x = 13;
},
run: function() {
alert(this.x);
}
});
window.addEvent('domready', function() {
var m = new MyClass();
m.run(); // ``13''
m.run.delay(2000); // ``undefined''
});
在摆弄之后,我设法找到了以下解决方案:
window.addEvent('domready', function() {
var m = new MyClass();
(function() { m.run() }).delay(2000); // ``13''
});
尽管如此,我想了解这里发生了什么,以及为什么简单地调用m.run.delay(…)
并不能解决问题。
答案 0 :(得分:4)
当我们在函数上调用delay
时,该函数将在全局对象的上下文中执行(通常为window
)。解决方案是将其包装在另一个函数中并捕获闭包中的对象m
。
更简单的方法是在delay
的调用中使用bind
parameter。 bind参数指定在调用函数时this
值应在函数内引用的内容。
m.run.delay(2000, m);
答案 1 :(得分:0)
当您以m.run()
方式调用函数时,this
关键字将引用基础对象m
。 Function.prototype.delay
可能会使用setTimeout
来调用延迟函数。
Function.prototype.delay = function(ms) {
setTimeout(this, ms);
}
此表单的问题是setTimeout
将在没有基础对象引用的情况下调用您的函数,因此this
将引用全局对象(〜 window )。 / p>
解决方案是明确地将调用对象传递给delay
。
/**
* delay - (number) The duration to wait (in milliseconds).
* bind - (object, optional) The object that the "this" of the function
* will refer to.
* args - (mixed, optional) The arguments passed (must be an array if the
* arguments are greater than one).
*/
m.run.delay(2000, m);