[英]Javascript setInterval not working
我需要每 10 秒運行一次 javascript 函數。
我理解語法必須像下面這樣工作,但我沒有取得任何成功:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
但這行不通。 有什么幫助嗎?
許多其他答案都集中在一種確實有效的模式上,但是他們的解釋對於您當前的代碼為什么不起作用的原因並不是很徹底。
您的代碼,供參考:
function funcName() {
alert("test");
}
var func = funcName();
var run = setInterval("func",10000)
讓我們把它分成幾塊。 你的函數funcName
很好。 請注意,當您調用funcName
(換句話說,您運行它)時,您將警告"test"
。 但請注意funcName()
——括號表示“調用”或“運行”函數——實際上並沒有返回值。 當一個函數沒有返回值時,它默認為一個稱為undefined
的值。
調用函數時,將其參數列表附加到括號中的末尾。 當您沒有任何參數來傳遞函數時,您只需添加空括號,例如funcName()
。 但是當你想引用函數本身而不是調用它時,你不需要括號,因為括號表示要運行它。
所以,當你說:
var func = funcName();
您實際上是在聲明一個值為funcName()
的變量func
。 但請注意括號。 funcName()
實際上是funcName
的返回值。 正如我上面所說,由於funcName
實際上並沒有返回任何值,它默認為undefined
。 因此,換句話說,您的變量func
實際上將具有值undefined
。
然后你有這一行:
var run = setInterval("func",10000)
函數setInterval
有兩個參數。 第一個是每隔一段時間運行的函數,第二個是每次運行函數之間的毫秒數。
但是,第一個參數確實應該是一個函數,而不是一個字符串。 如果它是一個字符串,那么 JavaScript 引擎將在該字符串上使用eval
。 因此,換句話說,您的 setInterval 正在運行以下 JavaScript 代碼:
func
// 10 seconds later....
func
// and so on
但是, func
只是一個變量(其值為undefined
,但這有點無關緊要)。 所以每隔十秒,JS 引擎就會評估變量func
並返回undefined
。 但這並沒有真正做任何事情。 我的意思是,從技術上講,它每 10 秒就會被評估一次,但你不會看到任何影響。
解決方案是給setInterval
一個函數來運行而不是一個字符串。 所以,在這種情況下:
var run = setInterval(funcName, 10000);
請注意,我沒有給它func
。 這是因為func
不是您代碼中的函數; 它是undefined
的值,因為您分配了它funcName()
。 就像我上面說的, funcName()
會調用函數funcName
並返回函數的返回值。 由於funcName
不返回任何內容,因此默認為undefined
。 我知道我已經說過好幾次了,但這確實是一個非常重要的概念:當你看到funcName()
時,你應該想到“ funcName
的返回值”。 當你想引用一個函數本身時,比如一個單獨的實體,你應該去掉括號,這樣你就不會調用它: funcName
。
因此,您的代碼的另一個解決方案是:
var func = funcName;
var run = setInterval(func, 10000);
但是,這有點多余:為什么使用func
而不是funcName
?
或者您可以通過修改兩個位來盡可能地保持原始代碼的真實性:
var func = funcName;
var run = setInterval("func()", 10000);
在這種情況下,JS 引擎將每十秒評估一次func()
。 換句話說,它會每十秒提醒一次"test"
。 然而,正如那句名言所說, eval
是邪惡的,所以你應該盡可能避免它。
這段代碼的另一個轉折是使用匿名函數。 換句話說,一個沒有名字的函數——你只是把它放在代碼中,因為你不在乎它叫什么。
setInterval(function () {
alert("test");
}, 10000);
在這種情況下,因為我不關心函數的名稱,所以我只留下一個通用的、未命名的(匿名)函數。
將setInterval("func",10000)
更改為setInterval(funcName, 10000)
或setInterval("funcName()",10000)
。 前者是推薦的方法。
那是因為你應該傳遞一個函數,而不是一個字符串:
function funcName() {
alert("test");
}
setInterval(funcName, 10000);
您的代碼有兩個問題:
var func = funcName();
立即調用該函數並分配返回值。"func"
也是無效的。 調用類似 eval 的函數將是setInterval("func()", 10000)
。嘗試這個:
function funcName() {
alert("test");
}
var run = setInterval(funcName, 10000)
順便說一句,這不起作用
setInterval(function () {
alert("test");
}, 10000);
我必須給匿名函數起一個名字(隨便你喜歡什么):
setInterval(function alertNotification () {
alert("test");
}, 10000);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.