复制自:https ://stackoverflow.com/a/16063711/1641941
这个变量
在所有示例代码中,您将看到this
引用当前实例。
this 变量实际上是指调用对象,它指的是函数之前的对象。
要澄清,请参阅以下代码:
theInvokingObject.thefunction();
this 引用错误对象的实例通常是在附加事件侦听器、回调或超时和间隔时。在接下来的两行代码pass
中,我们没有调用它。传递函数是:someObject.aFunction
并调用它是:someObject.aFunction()
。该this
值不是指在其上声明函数的对象,而是在invokes
它所声明的对象上。
setTimeout(someObject.aFuncton,100);//this in aFunction is window
somebutton.onclick = someObject.aFunction;//this in aFunction is somebutton
要this
在上述情况下引用 someObject ,您可以直接传递闭包而不是函数:
setTimeout(function(){someObject.aFuncton();},100);
somebutton.onclick = function(){someObject.aFunction();};
我喜欢在原型上定义返回闭包函数的函数,以便对闭包范围中包含的变量进行精细控制。
var Hamster = function(name){
var largeVariable = new Array(100000).join("Hello World");
// if I do
// setInterval(function(){this.checkSleep();},100);
// then largeVariable will be in the closure scope as well
this.name=name
setInterval(this.closures.checkSleep(this),1000);
};
Hamster.prototype.closures={
checkSleep:function(hamsterInstance){
return function(){
console.log(typeof largeVariable);//undefined
console.log(hamsterInstance);//instance of Hamster named Betty
hamsterInstance.checkSleep();
};
}
};
Hamster.prototype.checkSleep=function(){
//do stuff assuming this is the Hamster instance
};
var betty = new Hamster("Betty");