国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript對象中關于setTimeout和setInterval的this介紹

2024-05-06 14:21:37
字體:
來源:轉載
供稿:網友
在Javascript里,setTimeout和setInterval接收第一個參數是一個字符串或者一個函數,當在一個對象里面用setTimeout延時調用該對象的方法時
代碼如下:
function obj() {
this.fn = function() {
alert("ok");
console.log(this);
setTimeout(this.fn, 1000);//直接使用this引用當前對象
}
}
var o = new obj();
o.fn();

然后我們發現上面的代碼不是想要的結果,原因是setTimeout里面的this是指向window,所以要調用的函數變成 window.fn 為undefined,于是悲劇了。所以問題的關鍵在于得到當前對象的引用,于是有以下三種方法
代碼如下:
// 方法一:

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

這樣可以得到正確的結果,可惜Function.prototype.bind方法是ES5新增的標準,測試了IE系列發現IE6-8都不支持,只有IE9+可以使用。要想兼容就得簡單的模擬下bind,看下面的代碼
代碼如下:
// 方法二:
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();

首先通過一個自執行匿名函數傳當前對象和對象方法進去,也就是里面的參數a和b,再返回一個閉包,通過call方法使this指向正確。下面是比較簡潔的方法
代碼如下:
// 方法三:
function obj() {
this.fn = function() {
var that = this;//保存當前對象this
alert("ok");
setTimeout(function(){
that.fn();
}, 1000);//通過閉包得到當前作用域,好訪問保存好的對象that
}
}
var o = new obj();
o.fn();

上面第三個方法的兩個關鍵點是 保存當前對象this為別名that 和 通過閉包得到當前作用域,以訪問保存好的對象that;當對象方法里面多層嵌套函數或者setTimeout,setInterval等方法丟失this(也就是this不指向當前對象而是window),所以在this指向正確的作用域保存var that = this就變得很實用了
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 东辽县| 湟中县| 长乐市| 临泉县| 象州县| 平原县| 聂拉木县| 彝良县| 沁源县| 芒康县| 屏南县| 固始县| 通城县| 正蓝旗| 敖汉旗| 黔西| 郴州市| 南平市| 灵武市| 株洲县| 古浪县| 宜丰县| 临清市| 桓台县| 永康市| 泽州县| 唐河县| 称多县| 镶黄旗| 和龙市| 宣武区| 新闻| 赤水市| 福贡县| 湘乡市| 大同县| 禄丰县| 涿鹿县| 修武县| 岳阳县| 吴川市|