函數概述
函數是ECMAScript的核心。
聲明方式:關鍵字function,函數名,一組參數,以及在括號中待執行的代碼。
如果函數無明確的返回值,或者調用了沒有參數的return語句,返回的值是undefined
arguments對象
在函數代碼中,使用特殊對象arguments的作用:
- 就無需明確指出參數名,就能訪問它們
- 可用來檢測函數對象的參數個數
- 模擬函數重載
function explainArguments() {
// 訪問,檢測個數
console.log(arguments[0], arguments.length);
// 模擬函數重載
if (arguments.length === 1) {
console.log(arguments[0] + '拼接');
} else if (arguments.length === 2) {
console.log(arguments[1] + 100);
}
}
explainArguments('string', 100, '456'); // string, 3
explainArguments('string', 100); // 200
explainArguments('string'); // string拼接
Function對象(類)
ECMAScript的函數實際上是功能完整的對象。
Function類可以表示開發者定義的任何函數。
用Function類直接創建函數的語法如下:
var function_name = new function(arg1, arg2, ..., argN, function_body)
理解:
function add(iNum) {
console.log(iNum + 10);
}
function add(iNum) {
console.log(iNum + 20);
}
add(10); // 30 第二個函數重載了第一個函數
重寫代碼來理解:
var add = new Function('iNum', 'console.log(iNum + 10)');
var add = new Function('iNum', 'console.log(iNum + 20)'); // 重新定義了
add(10); // 30
例如:
如下代碼,add被定義爲函數,newAdd被聲明爲指向同一個函數的指針。用這兩個變量都可以執行該函數的代碼,輸出相同的結果。因此,如果函數名只是指向函數的變量,可以把函數作爲參數傳遞給另一個函數。
var add = new Function('iNum', 'console.log(iNum + 10)');
var newAdd = add;
add(10); // 20
newAdd(10); // 20
如下代碼,傳參兩個,要調用的函數和快遞給該函數的參數
function foo(fn, arg) {
fn(arg);
}
var add = new Function('iNum', 'console.log(iNum + 10)');
foo(add, 10); // 20
儘量不使用Function構造函數來創建函數,因爲它定義函數比用傳統方式要慢得多。所有函數都應該看作Function類的實例
Function對象的length屬性
如下函數,add()定義一個參數,長度爲1;add2()沒有定義參數,長度爲0。
function add(iNum) {
console.log(iNum);
}
function add2() {
console.log('123');
}
console.log(add.length); // 1
console.log(add2.length); // 0
ECMAScript可以接受任意多個參數(最多25個)
Function對象的方法
Function 對象也有與所有對象共享的 valueOf() 方法和 toString() 方法。這兩個方法返回的都是函數的源代碼,在調試時尤其有用。
function add(iNum) {
console.log(iNum + 10);
}
add.toString();