僅IE不支援setTimeout/setInterval函數的第三個以上參數

來源:互聯網
上載者:User

複製代碼 代碼如下:
setTimeout(function(obj){
alert(obj.a);
}, 2000, {a:1});

即傳了第三個參數,第三個參數將作為回呼函數的參數obj傳入。在非IE瀏覽器中都彈出了1。這樣有個好處,即解決了回呼函數的執行內容,比如要調用某個對象的某個方法,即可以通過參數把該對象傳進去。
複製代碼 代碼如下:
setTimeout(function(obj){
obj.method();
}, 2000, obj);

當然,你還可以傳多個參數給回呼函數,如下
複製代碼 代碼如下:
setTimeout(function(a, b){
alert(a);
alert(b);
}, 2000, 1,2);

這次我們傳了兩個參數1,2給回呼函數,Firefox/Safari/Chrome/Opera中依次彈出了1,2。只要你願意還可以傳更多。

雖然除了IE不支援第三個參數外,但Firefox和Safari/Chrome/Opera之間還是有區別的
複製代碼 代碼如下:
setTimeout(function(){
alert(arguments.length);
}, 2000, 1,2);

傳了兩個參數1,2給回呼函數,然後alert出實參的長度
Firefox : 3
Safari/Chrome/Opera : 2
奇怪吧,明明傳的是兩個參數,但Firefox中彈出的卻是3。如果輸出第三個參數會發現它是一個數字,有時還是負數。
關:

http://www.w3.org/TR/Window/

https://developer.mozilla.org/en/DOM/window.setTimeout

http://msdn.microsoft.com/en-us/library/ms536753%28v=vs.85%29.aspx 
//解決IE下setTimeout傳參數的bug
複製代碼 代碼如下:
//解決IE下setTimeout傳參數的bug
if(!+[1,]) {
(function(overrideFun){
window.setTimeout = overrideFun(window.setTimeout);
window.setInterval = overrideFun(window.setInterval);
})(
function(originalFun){
return function(code, delay){
var args = [].slice.call(arguments, 2);
return originalFun(
function(){
if (typeof code == 'string') {
eval(code);
}
else {
code.apply(this, args);
}
},
delay
)
}
}
);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.