2015-09-01 111 views
4

我有一些JS代碼如下;將參數傳遞給setTimeout回調函數

var x = self.someAJAXResponseJSON; // x has some object value here 
setTimeout(function(x){ 
    console.log("setTimeout ... : " + x); // But x is undefined here 
}, 1000); 

所以我想通過「x」到setTimeout回調函數。但是我在setTimeout中將「x」設置爲undefined。

我在做什麼錯?

使用Dojo JS

setTimeout(dojo.hitch(this, function(){ 
    this.executeSomeFunction(x); // what shud be this 
    console.log("setTimeout ... : " + x); // But x is undefined here 
}), 1000); 
+0

如果'變種x'被前面所定義的,是不是這種可能 - >'的setTimeout(函數(){ 的console.log( 「...的setTimeout:」 + X); },1000);'。從'callback'中刪除'x'並直接賦值? –

+0

好吧,我認爲這種情況下的目標應該像創建具有不同_x_值的多個函數一樣。你能解釋一下更多@testndtv? – pietro909

回答

2

在您的代碼已更新

修復類似問題的任何想法,console.log(x)指回調函數的參數x

只要忽略它的函數簽名,你會被罰款:

setTimeout(function(){ 
    console.log("setTimeout ... : " + x); // now x is the global x 
}, 1000); 
+0

Thx ..你還應該看看更新的問題嗎? – testndtv

4

setTimeout調用回調函數,它不傳遞任何參數(默認);也就是說,調用回調時,參數x未定義。

如果刪除參數x,x在函數體中不會引用未定義的參數,而是引用您在setTimeout()調用之外定義的變量。

var x = "hello"; 
setTimeout(function() { //note: no 'x' parameter 
    console.log("setTimeout ... : " + x); 
}, 1000); 

另外,如果必須是一個參數,你可以把它作爲一個參數傳遞給setTimeout(請你幫個忙,並以不同的名字,雖然):

var x = "hello"; 
setTimeout(function (y) { 
    console.log("setTimeout ... : " + y); 
}, 1000, x); 
+0

Thx ..你還應該看看更新的問題嗎? – testndtv

1

這是因爲該函數被調用時不傳遞任何參數:所以x未定義。

你應該把它包在一個閉包,如果你願意用不同的參數來調用它X

var x = self.someAJAXResponseJSON; // x has some object value here 
setTimeout((function(y){ 
    return(function() { 
     console.log("setTimeout ... : " + y); 
    }) 
})(x), 1000); 
+1

這不完全是「該功能是從不同的範圍調用。」該函數打開一個新的作用域,該作用域中定義了一個標識符「x」,默認情況下這個標識符是未定義的。 – Purag

+0

謝謝@Purag,我編輯了我的答案 – pietro909

+0

你也不需要*不同的名字。它將不起作用。 – Purag

5

或者你可以做到這一點,而無需創建一個封閉。

function myFunction(str1, str2) { 
    alert(str1); //hello 
    alert(str2); //world 
} 

window.setTimeout(myFunction, 10, 'hello', 'world'); 

但要注意它不IE < 10according to MDN工作。

+0

Thx ..你還可以看看更新的問題嗎? – testndtv

1

setTimeout方法被設計爲將函數或代碼片段作爲它的第一個參數,但在你的情況下,你已經採用了一個帶參數x的匿名函數,並且調用時沒有采用任何參數,所以它顯示爲未定義的,因爲沒有具體的函數定義需要x。你可以做的是你可以先定義你想調用的函數,然後在setTimeout方法中調用它。見下面的代碼片斷:

var x = self.someAJAXResponseJSON; 
function mylog(x){ 
    console.log("setTimeout ... : " + x); 
} 
setTimeOut(mylog(x),1000);