iT邦幫忙

0

單獨執行window.setTimeout(location.replace('網址'), 10000)沒作用

com 2018-09-26 18:21:22834 瀏覽

【CASE_A】請問下面程式碼轉址不會生效。
function myFunction() {
window.setTimeout(location.replace('https://www.google.com/'), 10000);
}
【CASE_B】我改成下面程式碼,轉址生效,但是延宕10秒不會生效。
function myFunction() {
try{
window.setTimeout(location.replace('https://www.google.com/'), 10000);
}
catch (e) {
alert(e);
}
}
【CASE_C】我再改成下面程式碼,轉址與延宕10秒兩者都會生效。
function N0_history_replace(){
location.replace('http://www.xn.com.tw/');
}
function myFunction() {
try{
window.setTimeout(N0_history_replace, 10000);
}
catch (e) {
alert(e);
}
}
【CASE_D】我又再改成下面程式碼,url不會生效。
function N0_history_replace(url){
location.replace(url);
}
function myFunction() {
try{
window.setTimeout(N0_history_replace('http://www.xn.com.tw/'), 10000);
}
catch (e) {
alert(e);
}
}

我想問一【CASE_B】中造成延宕10秒不會生效的原因為何?
我想問二【CASE_D】url不會代入的原因為何?
先謝謝各為前輩。

1 個回答

4
froce
iT邦大師 5 級 ‧ 2018-09-26 19:10:44
最佳解答

https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout

1.你必須先理解函數本身和函數執行後是不同的:

function test(s){
    console.log(s)
    return 2
}

// a是test這個函數本身
var a = test
// 可以正常執行,因為a = test,所以a("1") = test("1")
a("1")
// 顯示[Function: test],告訴你a就是test
console.log(a)


var b = test("1")
// 不能正常執行,會告訴你TypeError: b is not a function
b("1")
// 顯示2這個回傳值,因為b被指向test("1")的結果,也就是他的回傳值
console.log(b)

2.setTimeout你可以看MDN,會告訴你第一個參數必須是function或是code(字串)。
3.所以你傳入的,必須是個函數,以B來說,

location.replace('https://www.google.com')

這已經是結果了,所以setTimeout出錯。
所以你應該要這樣改:

function myFunction() {
    try{
        window.setTimeout(function(){location.replace('https://www.google.com')}, 10000);
    } catch (e) {
        alert(e);
    }
}

或是把你的程式碼變成字串,js會把他用eval()去執行。但不建議。

function myFunction() {
    try{
        window.setTimeout("location.replace('https://www.google.com')", 10000);
    } catch (e) {
        alert(e);
    }
}

D跟B一樣的狀況,不贅述,setTimeout後面可以帶參數給傳入的function

setTimeout(myFunc, 10000, "www.google.com")

我要發表回答

立即登入回答