在 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)