2011年3月18日

在一定時間後調用函數

在 W3school 的資料中
setInterval(code,millisec)
setTimeout(code,millisec)
這兩個方法的範例
code 的類型都是字符串

例如:
var timer = setTimeout("alret('測試')",1000)
var timer = setTimeout("someFunction()",1000)

但其實 setTimeout 不一定只接受字符串
有另外一種寫法
相對上面那兩個例子,可以改寫成
var timer = setTimeout(function () {alret('測試')},1000)
var timer = setTimeout(someFunction,1000)

但似乎不用字符串類型就無法對函數提供變數了?
var timer = setTimeout("someFunction(123)",1000)
就不知道要怎麼改寫了

而我要解決的問題是
setTimeout 要調用的函數是區域變數
像這樣
function A() {

 function B() {}
 timer = setTimeout("B()",1000)
}

結果會出錯
我推測是因為1秒後全域的 setTimeout 解析字符串"B()"
而他的理解是執行全域變數B
但B是只存在於A裡面的區域變數
理所當然就找不到而出錯了

如果改寫成這樣
function A() {

 function B() {}
 timer = setTimeout(B,1000)
}

直接使用 B 函數的函數名
結果就沒問題了
我推測是因為這樣寫 setTimeout 就能知道要執行區域變數B

但這個方法沒辦法把變數給函數
所以就只能這樣寫了
function A() {

 var x1 = 10
 function B() {var x2 = x1}
 timer = setTimeout(B,1000)
}



3月26日新增:
根據這裡的資料,明確指出
  • 第一個參數可以是函數物件或是字符串,而字符串不建議使用
  • 參數使用字符串時會在全局作用域執行。
    (因為使用到eval函數,且不是直接調用,符合了在全局作用域執行的條件)
之前腦袋轉不過來:
但似乎不用字符串類型就無法對函數提供變數了?
var timer = setTimeout("someFunction(123)",1000)
就不知道要怎麼改寫了

這樣寫就可以了
var timer = setTimeout(function () {someFunction(123)},1000)

沒有留言:

張貼留言

Likey
創用 CC 授權條款