Skip to content

Instantly share code, notes, and snippets.

@zx1986
Created September 23, 2012 07:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zx1986/3769210 to your computer and use it in GitHub Desktop.
Save zx1986/3769210 to your computer and use it in GitHub Desktop.
Javascript setInterval callback issue
(function() {
$(document).ready(function() {
var test;
test = function(target) {
return console.log(target)
};
setInterval(test('bad'), 3000); // just works once
setInterval(function(){ test('good'); }, 3000); // it works, why?
});
}).call(this);
@zx1986
Copy link
Author

zx1986 commented Sep 23, 2012

我想第一個可以理解成:
執行被呼叫的 test(),將 test() 執行後所得到的“東西”回傳給 setInterval 當作 callback

第二個則是:
宣告一個匿名函式,將這個匿名函式丟給 setInterval 當作 callback

而如果是直接填 test 的話:
相當於 refer 到原本的 test function,所以也可以正常工作

所以,糾結點應該就是:
Javascript 中寫 test 與 test() 的差別?

http://www.plurk.com/p/hc6k0i

@zx1986
Copy link
Author

zx1986 commented Sep 23, 2012

第一個 setInterval 中的 test('bad') 并不是給 setInterval 當作 callback function,
而是:執行 test('bad'),將其結果傳給 setInterval 作為 callback function
setInterval 中的這第一個參數不是一個 function object,而是一個 function call,所以它就執行下去了。

第二個 setInterval 中,由于宣告了一個匿名函式,所以 setInterval 接受了函式型態的這個第一個參數,
依照 setInterval 的正常運作,它將這個匿名函式當作了它的 callback function

而如果直接寫 setInterval(test, 3000),由于這裏的 test 是一個 reference,
直接指到原本宣告的 test 物件(而它正是一個 function),所以也可以運作。

@zx1986
Copy link
Author

zx1986 commented Sep 23, 2012

而在 CoffeeScript 中,要達成呼叫匿名函式的效果,得這樣:

setInterval ( ->
    test('hello')
), 3000

@zx1986
Copy link
Author

zx1986 commented Sep 24, 2012

參考:https://gist.github.com/905349
以前學長就講過了啊,笨蛋!

Bonana King:

    js的function是這樣
    如果有個function叫做test
    用 var test = function(){}
    或function test(){} 來建立
    之後呼叫的話就打test加上小括弧() 代表執行
    然後重點是在於setInterval裡面
    setInterval( a, b);
    b是時間 a的type要是function
    所以
    setInterval( test, 1000) // ok
    setInterval( test(), 1000) // 不ok
    加了()之後 只是叫他執行一次的意思 不是傳了一個function給他
    然後除了
    setInterval( function(){
    test('good');
    }, 1000);
    這種寫法可以傳值進去之外 我記得還有別的方法 可是平常都沒在用所以我忘記了 哈哈

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment