Rumah > Soal Jawab > teks badan
var obj = { //我想让this指代上面这个obj a:function(){ setTimeout(function(){ console.log(this); },100); }, //好吧,曲折解决了 b:function(){ var me = this; setTimeout(function(){ console.log(me); },100); }, //如果我要把callback拿出来,又有问题了。。。 c:function(){ //这下不管我怎么在c和callback里倒来倒去的找变量,都不能在callback里找到最上面的那个obj了。。 setTimeout(this.callback,100); }, callback:function(){ console.log(this);//我需要在这里找到obj.. } }; obj.a(); //obj.b(); //obj.c();
伊谢尔伦2017-04-10 12:43:18
atrl的方法解决了将callback函数剥离,并保持this引用的问题。
在比较先进的浏览器中可以使用这种方法:
c:function(){ setTimeout(this.callback.bind(this),100); }
ie等浏览器可以自行扩展Function对象的prototype实现。但道理其实都是创建了新的函数。
此处的需求这样做就可以了。有时候会碰到事件处理函数需要解耦的情况,由于还要考虑解除绑定,会更复杂一些,需要自己写对象进行管理。
大家讲道理2017-04-10 12:43:18
obj = { c:function(){ var that = this; setTimeout(function(){that.callback()},100); },
大家讲道理2017-04-10 12:43:18
c:function(){ var _this = this; setTimeout(function(){_this.callback.call(_this)},5000); }
大家讲道理2017-04-10 12:43:18
setTimeout的第一个参数相当于一个匿名方法体或者是方法指针,它不关心方法的所有者是谁,他只关心方法能做什么,这种情况下 想获得obj除了闭包就是传参数给匿名方法了
PHPz2017-04-10 12:43:18
在 callback 里面直接就可以拿到 obj:
callback:function(){ console.log(obj);//我需要在这里找到obj.. }