函數重載是指在同一作用域內,可以有一組具有相同函數名,不同參數列表(參數個數、類型、順序)的函數,這組函數被稱為重載函數。重載函數通常用來聲明一組功能相似的函數,這樣做減少了函數名的數量,避免了名字空間的污染,對於程序的可讀性有很大的好處。
但是在 JS 如果不通過一些方法是無法實現重載的,可以從以下兩個角度去理解。
1. 方法簽名
方法簽名指的是函數的名稱加形參列表,並且通過函數的名稱或者形參列表都可以區分出是不同的函數。
JS 中通過形參是沒有辦法區分出不同的函數的,只能通過函數的名稱區分出不同的函數,現在我們來看一下下面的例子.
function add(a, b) {
return a + b;
}
function add(a, b) {
return a + b + 1;
}
上述實際上是一個函數,后面的函數 add 會覆蓋前面的函數,究其原因還是因為 JS 是弱類型的語言,a 和 b 實際上都是用 var 聲明的,等價於
function add(var a, var b) {
return a + b;
}
所以在 JS 中只能通過函數名稱來辨別是不是同一個函數,形參是沒有用的。
但是在強類型的語言中就是可以的,例如在 c 語言中,定義函數時形參必須要指定類型,向里面傳值的時候也必須傳遞指定類型的值。函數名相同,形參名不同的函數也會被認為是不同的函數。
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b + 1;
}
int main() {
printf("第一種聲明函數結果 add(1, 3)= %d \n", add(1, 3));
printf("第二種聲明函數結果 add(1.0, 3.0)= %lf \n", add(1.0, 3.0));
}
上述兩個函數是不同的,可以打印一下結果驗證一下。
所以,在 C 語言這種強類型的語言中是可以實現函數重載的,JS 這種弱類型的語言是不可以的。
2. 函數指針
另一中理解的角度是可以將函數名想象為指針,函數名中存放的是函數體存放的地址。還是通過代碼來說明。
function add(a, b) {
return a + b;
}
function add(a, b) {
return a + b + 1.0;
}
上面的兩種聲明方式等價於
var add = function (a, b) {
return a + b;
}
add = function (a, b ) {
return a + b + 1.0;
}
最終 add 實際上指向的是第二個函數,第一個函數被覆蓋了,所以最終調用 add 時調用的也是第二個函數,並不能實現函數的重載。
console.log(add(1, 3)) // 5
完,如有不恰當之處,歡迎指正哦。