- return : 只有 return; 和沒有 return 一樣都回傳 undefined
- 參數 : 如果傳入的參數大於 function 定的參數, 多的會被忽略; 如果傳的參數少於 function 定的參數, 則少的部份會變成 undefined
- function literal
var f = function ff() {}
window.onload = function() {}
上面程式宣告的 f 是 function literal, ff 則只能用在 f function 主體裡面. 如果在外部使用 ff 就會出現 undefined 的錯誤.
function literal 可看出三種用法.
1. 宣告在變數中
var f = function() {}
window.onload = function() {}
2. 直接傳入成為參數
var callAnyWay = function(f) {}
window.onload = function() {} );
}
3. 宣告 function 直接呼叫
window.onload = function() {}( function() {} );
}
- parameters
function testParams(a, b, c) {}
window.onload = function() {}
- arguments : 可取得所有參數像操作陣列一樣操作參數. 不過要注意 arguments 不是陣列, 而是一個和陣列有編號和長度屬性的物件. 比方說 Array 的 length 真的可以拿來指定長度, 但是 arguments 的 length 在 ECMAScript 卻沒有說可以指定. 而且改變 arguments 的值也會改變具名參數的值, arguments 和具名參數只是指向具名參數的兩種方式.
function writeAllArgs(arg0) {}
alert(arg0); // 1
arguments[0] = 123456;
alert(arg0); // 123456
}
window.onload = function() {}
- arguments.callee : 這個屬性指向 arguments 物件所屬的 function
function testCallee() {}
window.onload = function() {}
- function 也是一種資料, 可以在參數間傳遞, 要呼叫的時候用 () 就可以了.
function callMe(me) {}
function showMsg(msg) {}
window.onload = function() {}
- length屬性 : function 的 arguments 物件的 length 可得知總共傳了幾個參數, 而 function 的 length 屬性可以知道 function 定義了幾個參數
function showLength1() {}
function showLength2(args) {}
window.onload = function() {}
- function 的 call method. 可直接把 function 指定給物件呼叫
function showThis() {}
return this + s;
}
window.onload = function() {}
- function 的 apply method. 可直接把 function 指定給物件呼叫. 和 call 的差別在 apply 使用陣列的方式傳遞參數
function showThis() {}
return this + s;
}
window.onload = function() {}
- closure : 就是一種匿名 function, 不過注意 javascript 的 function 很特別, 例如可以當成資料傳遞, 加個() 就可以呼叫. 還有因為 function 靈活的關係, 作用域也要注意. (closure 有正式的解釋, 請參考書上所寫的.)
- function 被定義之後, 會加入一個 call 物件到最前面, 指到 arguments 物件, 用 var 宣告的變數也都定義在 call 物件內. 而且所有的區域變數, 參數等也都在 call 物件內. 這樣的結果就是可以把參數或任何的定義都藏在 call 物件中.
所以假如我要加一個 javascript 檔案到 html 中的時候, 如果我把所有的 function 都寫成廣域 function, 就很容易因為命名相同造成衝突. 解決的辦法可能是把 function 通通寫在統一的 function 裡面.
比方說.
function myF() {}
}
function methodA() {}
window.onload = function() {}
這樣就算 methodA 重覆到了也沒關係, 因為都包在自己定�����的 myF 裡面了. 但還需要一個 myF 的名稱. 如果需要的話可以更簡單
(function() {}
})();
這樣也是呼叫 methodA 又不會佔用到任何廣域名稱. 還有, 可以把動態的屬性藏在匿名 function 中, 再回傳匿名 function 夾帶著動態屬性, 這樣每次呼叫一個 function 都會得到不同的結果.
var test1 = function() {}
}
var test2 = (function() {}
})();
window.onload = function() {}
從上面的 function 中, test1 是直接回傳一個 id 為 0 且回傳 id++ 的 function, 每次呼叫 test1() 都會初始 id 為 0. test2 則是先起始 id 為 0 傳到 test2 變數中, 則每次呼叫 test2() 都是執行回傳 id++ 的 function.