有 3 種定義函數的方式 函數聲明 函數表達式 Function 構造函數(很少使用) 函數聲明 關鍵字後需要指定函數名 函數表達式 關鍵字後不用指定函數名;函數末尾需要添加一個分號,就像聲明其他變數時一樣 Function 構造函數 構造函數可以接收任意數量的參數,但最後一個參數始終都被看成是函數 ...
有 3 種定義函數的方式
- 函數聲明
- 函數表達式
- Function 構造函數(很少使用)
函數聲明
function
關鍵字後需要指定函數名
function sum(num1, num2) {
return num1 + num2;
} // 不加分號
console.log(sum(2, 3)); // 5
函數表達式
function
關鍵字後不用指定函數名;函數末尾需要添加一個分號,就像聲明其他變數時一樣
var sum = function (num1, num2) {
return num1 + num2;
}; // 加分號
console.log(sum(2, 3)); // 5
Function 構造函數
Function
構造函數可以接收任意數量的參數,但最後一個參數始終都被看成是函數體,而前面的參數則枚舉出了新函數的參數。
var sum = new Function('num1', 'num2', 'return num1 + num2'); // 不推薦
console.log(sum(2, 3)); // 5
函數聲明與函數表達式
函數聲明 與 函數表達式 是有區別的。執行代碼時,解析器會率先讀取函數聲明,並使其在執行任何代碼之前可用(可以訪問);至於函數表達式,則必須等到解析器執行到它所在的代碼行,才會真正被解釋執行。
同時說明:函數聲明會被提升;函數聲明要早於變數聲明被解析器讀取;
// 函數聲明提升
console.log(sum(2, 3)); // 5 (函數聲明被提升到源代碼樹頂部)
function sum(sum1, sum2) {
return sum1 + sum2;
}
如果把上面的函數聲明改為等價的函數表達式,執行將報錯:
console.log(sum(2, 3)); // TypeError: sum is not a function
var sum = function (sum1, sum2) {
return sum1 + sum2;
}
關於ECMAScript中的函數
- 函數實際是對象。每個函數都是
Function
類型的實例,而且都與其他引用類型一樣具有屬性和方法。 - 由於函數是對象,因此 函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。即:函數是對象,函數名是指針
- 因為函數名本身就是變數,所以函數也可以作為值來使用。也就是說,不僅可以像傳遞參數一樣把函數傳遞給另一個函數,而且可以將一個函數作為另一個函數的結果返回。
- 要訪問函數的指針而不執行函數的話,必須去掉函數名後面的那對大括弧。
- 沒有重載,後面的函數會覆蓋前面的同名函數。
- 每個函數都包含兩個非繼承而來的方法:apply() 和 call()。用途都是在特定的作用域中調用函數,即設置函數體內 this 對象的值。
function sum(num1, num2) {
return num1 + num2;
}
console.log(sum(2, 3)); // 5
var anotherSum = sum; // 使用 不帶圓括弧 的函數名是訪問函數指針,而非調用函數
console.log(anotherSum(2, 3)); // 5
// 以下為關鍵代碼
sum = null;
console.log(anotherSum(2, 3)); // 5
可以結合以下例子理解
var obj1 = new Object();
var obj2 = obj1;
obj1.name = 'Nicholas';
console.log(obj2.name); // Nicholas
obj1 = null;
console.log(obj2.name); // Nicholas