这是关于解决this
价值。这是通过以下方式解决的:
myObject.something();//this in something is myObject
window.something();//this is window
button.onClick=function();//this when button is clicked is button
已经给出了如何解决它,这是一个常见的陷阱,传递回调就像在下面的例子中使用 setTimeout
var test = function () {
var me = this;// set reference to this
this.sayAgain=function(){
console.log("Hi, I am "+me.toString());
}
}
test.prototype.toString=function(){
return "test";
}
test.prototype.say = function () {
console.log("Hi, I am "+this.toString());
}
var t = new test();
setTimeout(t.say,50);//=window passing functon without ref to this
setTimeout(function(){
t.say();
},150);//=test passing ref with function
setTimeout(t.sayAgain,200);//=test using me as the saved this context
第二个超时将闭包传递给 setTimeout,如果您计划通过数百次 say 回调但只创建几个测试对象实例,那么最后一个 (sayAgain) 的实现会稍微好一些。
这是因为您在创建测试实例时创建了一个闭包,但在将 sayAgain 作为回调传递时没有创建闭包,如果您创建了许多测试实例并且不会通过say
那么多次,则从函数体中删除 this.me 和 this.sayAgain 并传递say
为一个关闭。
您可以使用Function.prototype.bind但它在 IE < 8 中不受支持,我不确定它是否会像我的示例中使用t.say
.