摘要:它們將被傳入推遲執行的函數以下不支持更多的參數,可以用或實現被推遲執行的回調函數是在全局環境執行,這有可能不同于函數定義時的上下文環境。
事件流逝觸發的事件
這類事件不是基于用戶針對可見Web頁面元素執行的行為,而是基于時間的流逝。
和JavaScript中所有其他事件一樣,這些時間流逝事件也是由函數處理的。
撿重點說了
setTimeout允許添加更多的參數。它們將被傳入推遲執行的函數
setTimeout(function(a,b){ alert(a+b); },1000,2,5) // 7
IE9以下不支持更多的參數,可以用apply或bind實現
被setTimeout推遲執行的回調函數是在全局環境執行,這有可能不同于函數定義時的上下文環境。
var x = 1; var o = { x: 2, y:function(){console.log(this.x);} }; setTimeout(o.y,1000); // 1 // 另一個例子 function User(login) { this.login = login; this.sayHi = function() { console.log(this.login); } } var user = new User("John"); setTimeout(user.sayHi, 1000);
this.login會報錯,因為取不到值。
一種解決方法是將user.sayHi放在函數作用域內執行,而不是在全局作用域中。
setTimeout(function(){ user.sayHi(); }, 1000); // "John"
另一種方法,就是采用閉包,將this與當前作用域綁定。
document.getElementById("click-ok").onclick = function() { var self = this; setTimeout(function() { self.value="OK"; }, 100); } // setTimeout指定的函數中的this,總是指向定義時所在的DOM節點。setInterval()
setInterval指定某個任務每隔一段時間就執行一次,也就是無限次的定時執行。