var f = function(){ this.fname = 'F Function'; }; //invoke from bar and bar2 func f.prototype.sayName = function(){ alert(window == this); // when invoke from bar then true, bar2 then false alert(this.fname); //when invoke from bar then 'undefined', bar2 then 'F Function' }; //invoke sayName func in setTimeout f.prototype.bar = function(){ setTimeout(this.sayName,1000); // or //var that = this; //setTimeout(that.sayName,1000); alert(window == this) remain show false in sayName fun }; //invoke sayName func in setTimeout f.prototype.bar2 = function(){ var that = this; setTimeout(function(){that.sayName()},1000) } var ins = new f(); ins.bar(); //true 'undefined' ins.bar2(); // false 'F Function'
以上例子能解释 this 在setTimeout 中的 含义。
原因(https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout#The_%27this%27_problem):