2013-01-16 33 views
1

在我的javascript代碼,我有以下幾點:傳遞參數在JavaScript中運行的正確方法是什麼?

function foo(param1) { 
    setInterval(bar(param1), 3000); 
} 

function bar(msg) { 
    alert(msg); 
} 

function set() { 
    foo('hello'); 
} 

並在頁面加載我叫set(),它給人的警報消息只有一次。爲什麼它不能像我期望的那樣工作?我認爲問題出在我通過foo()函數的參數上,但究竟是什麼,我無法弄清楚。

如果問題出現在參數中,可以通過什麼方法獲得所需的結果。

謝謝。

回答

1

你需要傳遞一個函數setInterval,你正在執行一個函數並傳遞它的返回值(undefined,因爲執行的函數沒有返回值)。

嘗試使用匿名函數:

function foo(param1) { 
    setInterval(function() { 
     bar(param1); 
    }, 3000); 
} 

function bar(msg) { 
    alert(msg); 
} 

param1永遠不會改變在這裏,所以沒有必要對任何事情更加複雜。 Here's a working example.

+0

謝謝。所以它的匿名函數,而不是閉包。 – pratik

1

setInterval在給出調用整個函數的返回值時需要一個函數。

修改後的版本,應該工作:

var msg = null; 

function foo(param1) { 
    // When foo is called, its argument is set to msg variable, so the function called 
    // by setInterval will have access to the message that must show in a window.alert 
    msg = param1; 
    setInterval(bar, 3000); 
} 

function bar() { 
    alert(msg); 
} 

function set() { 
    foo('hello'); 
} 
+0

雖然這將與全局變量一起工作,但我希望'bar(msg)'精確地提醒我傳遞給它的參數'msg'的值。 – pratik

+0

@patrik你是不對的。這種方法做你想做的。其他討論是閉包方法更好,但我只是想告訴你你的代碼是錯誤的,並且提供了一個關於如何使其工作的基本提示。 –

+0

是的,你的回答是正確的,它完成了這項工作,但是如果我不想創建一個全局變量呢?所以在這種情況下,我將不得不使用匿名函數方法。 – pratik

2

最好的辦法是使用closure訪問從一個函數,你傳遞給setInterval參數:

function foo(param1) { 
    setInterval(function() { 
     bar(param1); 
    }, 3000); 
} 

function bar(msg) { 
    alert(msg); 
} 

function set() { 
    foo('hello'); 
} 
+3

對於我日常的職業生涯來說,這段代碼沒有關閉。從你關聯的問題來看:「這不是一個閉包,關閉是你返回內部函數的時候,內部函數會在離開前關閉foo的變量。」 – jbabey

+0

@ jbabey不夠公平,我糾正了。 :)所以我可以更正答案,從父上下文訪問變量的函數的適當術語是什麼? –

+0

@PhilBooth它只是一個在命名('foo')函數聲明中聲明的匿名函數聲明。 – jbabey

相關問題