最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Javascript對象中關(guān)于setTimeout和setInterval的this介紹

 更新時間:2012年07月21日 09:32:00   作者:  
Javascript對象中關(guān)于setTimeout和setInterval的this介紹,需要的朋友可以參考下
在Javascript里,setTimeout和setInterval接收第一個參數(shù)是一個字符串或者一個函數(shù),當(dāng)在一個對象里面用setTimeout延時調(diào)用該對象的方法時
復(fù)制代碼 代碼如下:

function obj() {
this.fn = function() {
alert("ok");
console.log(this);
setTimeout(this.fn, 1000);//直接使用this引用當(dāng)前對象
}
}
var o = new obj();
o.fn();

然后我們發(fā)現(xiàn)上面的代碼不是想要的結(jié)果,原因是setTimeout里面的this是指向window,所以要調(diào)用的函數(shù)變成 window.fn 為undefined,于是悲劇了。所以問題的關(guān)鍵在于得到當(dāng)前對象的引用,于是有以下三種方法
復(fù)制代碼 代碼如下:

// 方法一:

function obj() {
this.fn = function() {
alert("ok");
console.log(this);
setTimeout(this.fn.bind(this), 1000);//通過Function.prototype.bind 綁定當(dāng)前對象
}
}
var o = new obj();
o.fn();

這樣可以得到正確的結(jié)果,可惜Function.prototype.bind方法是ES5新增的標(biāo)準(zhǔn),測試了IE系列發(fā)現(xiàn)IE6-8都不支持,只有IE9+可以使用。要想兼容就得簡單的模擬下bind,看下面的代碼
復(fù)制代碼 代碼如下:

// 方法二:
function obj() {
this.fn = function() {
alert("ok");
setTimeout((function(a,b){
return function(){
b.call(a);
}
})(this,this.fn), 1000);//模擬Function.prototype.bind
}
}
var o = new obj();
o.fn();

首先通過一個自執(zhí)行匿名函數(shù)傳當(dāng)前對象和對象方法進(jìn)去,也就是里面的參數(shù)a和b,再返回一個閉包,通過call方法使this指向正確。下面是比較簡潔的方法
復(fù)制代碼 代碼如下:

// 方法三:
function obj() {
this.fn = function() {
var that = this;//保存當(dāng)前對象this
alert("ok");
setTimeout(function(){
that.fn();
}, 1000);//通過閉包得到當(dāng)前作用域,好訪問保存好的對象that
}
}
var o = new obj();
o.fn();

上面第三個方法的兩個關(guān)鍵點是 保存當(dāng)前對象this為別名that 和 通過閉包得到當(dāng)前作用域,以訪問保存好的對象that;當(dāng)對象方法里面多層嵌套函數(shù)或者setTimeout,setInterval等方法丟失this(也就是this不指向當(dāng)前對象而是window),所以在this指向正確的作用域保存var that = this就變得很實用了

相關(guān)文章

最新評論

泾阳县| 黑山县| 黑龙江省| 大新县| 介休市| 定西市| 唐海县| 龙泉市| 介休市| 吐鲁番市| 布尔津县| 襄汾县| 尚义县| 灵山县| 金坛市| 西乡县| 垫江县| 邢台市| 灯塔市| 开平市| 佛教| 定州市| 定远县| 息烽县| 奉贤区| 丹江口市| 碌曲县| 菏泽市| 栾川县| 宜昌市| 南城县| 砚山县| 喜德县| 鲁山县| 台安县| 正宁县| 竹山县| 七台河市| 盈江县| 宣城市| 静安区|