也許像
//first we create the function and give it a name (so it can be re-called)
//we then wrap it in parentheses and invoke it with() so it fires immediately (this is an IIFE)
(function loop() {
//animate right
$('div').animate({ marginLeft: '+=150px' }, 800, function() {
//when the animate right is done, animate back left
$(this).animate({ marginLeft: '-=150px' }, 800, function(){
//setTimeout wants a function to invoke and a duration to wait until doing so
//we give it 'loop' which is the name of our function so it will be re-used, thus creating the complete animation loop
setTimeout(loop, 3000);
});
});
})();
更多參考:https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout
要談的東西功能多一點。假設你有以下...
function sayDog() { console.log('dog'); }
function sayCat() { console.log('cat'); }
那兩個人函數定義。如你所知,他們的實際邏輯只有在你給他們打電話之後纔會執行。
sayDog(); <-- invoke sayDog
sayCat(); <-- invoke sayCat
但在JavaScript中,這些名稱只是變量。我們可以很容易地將它們定義爲...
var sayDog = function() { console.log('dog'); }
sayDog();
以相同的結果結束。 現在讓我們看看setTimeout。 setTimeout的目的是在一段時間內延遲函數的執行。所以說你有這個...
setTimeout(sayDog(), 1000);
你會期望sayDog在執行前等待1000。但你用()明確執行它,所以它沒有等待。作爲一個方面說明,如果sayDog沒有返回另一個函數來執行,那麼setTimeout在1000之後不會有任何事情要做。
function printPet (petFunction) { petFunction(); }
printPet(sayDog);
printPet(sayCat);
將函數引用傳遞給其他函數是完全有效的。上面有printPet採取任何給予它並援引它。它也會導致sayDog和sayCat被調用。
有關您最後一個代碼的文檔:https://developer.mozilla。org/en-US/docs/Web/JavaScript/Reference /函數 對象引用是值,謝謝 – Amine