標籤:執行 包含 pac and dom border keyword 參數傳遞 返回
函數也是對象
想弄明白回呼函數,首先的清楚地明白函數的規則。在javascript中,函數是比較奇怪的,但它確確實實是對象。確切地說,函數是用Function()建構函式建立的Function對象。Function對象包含一個字串,字串包含函數的javascript代碼。假如你是從C語言或者java語言轉過來的,這也許看起來很奇怪,代碼怎麼可能是字串?但是對於javascript來說,這很平常。資料和代碼之間的區別是很模糊的。
| 123 |
//可以這樣建立函數var fn = new Function("arg1", "arg2", "return arg1 * arg2;");fn(2, 3); //6 |
這樣做的一個好處,可以傳遞代碼給其他函數,也可以傳遞正則變數或者對象(因為代碼字面上只是對象而已)。
傳遞函數作為回調
很容易把一個函數作為參數傳遞。
| 12345678 |
function fn(arg1, arg2, callback){ var num = Math.ceil(Math.random() * (arg1 - arg2) + arg2); callback(num); //傳遞結果} fn(10, 20, function(num){ console.log("Callback called! Num: " + num); }); //結果為10和20之間的隨機數 |
可能這樣做看起比較麻煩,甚至有點愚蠢,為何不正常地返回結果?但是當遇上必須使用回呼函數之時,你也許就不這樣認為了!
那看看下面的樣本:
| 12345678910 |
function foo(){ var a = 10; return function(){ a *= 2; return a; }; }var f = foo();f(); //return 20.f(); //return 40. |
函數在外部調用,依然可以訪問變數a。這都是因為javascript中的範圍是詞法性的。函數式運行在定義它們的範圍中(上述例子中的foo內部的範圍),而不是運行此函數的範圍中。只要f被定義在foo中,它就可以訪問foo中定義的所有的變數,即便是foo的執行已經結束。因為它的範圍會被儲存下來,但也只有返回的那個函數才可以訪問這個儲存下來的範圍。返回一個內嵌匿名函數是建立閉包最常用的手段。
回調是什嗎?
使用回呼函數實際上就是在調用某個函數(通常是API函數)時,將自己的一個函數(這個函數為回呼函數)的地址作為參數傳遞給那個函數。而那個函數在需要的時候,利用傳遞的地址調用回呼函數,這時你可以利用這個機會在回呼函數中處理訊息或完成一定的操作。
—— 某專家
回呼函數,就是由你自己寫的。你需要調用另外一個函數,而這個函數的其中一個參數,就是你的這個回呼函數名。這樣,系統在必要的時候,就會調用你寫的回呼函數,這樣你就可以在回呼函數裡完成你要做的事。
—— 綠葉
javascript回呼函數