在JavaScript中,函數function就是對象。
JS中沒有方法重載
在JavaScript中,沒有方法(函數)重載的概念。
例子:
代碼如下:
<html>
<head>
<script type="text/javascript">
function add(number)
{
alert(number + 20);
}
function add(number, number1)
{
alert(number + 30);
}
add(10);
</script>
</head>
<body>
</body>
</html>
網頁中彈框顯示的是40。
說明雖然第二個方法是兩個參數,但是仍然調用了它。
交換兩個方法的順序之後,彈框顯示30,可以看出不管參數個數如何,是調用同名的後面的方法。
怎麼解釋這個現象?
這是因為函數聲明實際上是建立了一個對象:
代碼如下:
<html>
<head>
<script type="text/javascript">
function add(number)
{
alert(number + 20);
}
/*
上面的函數等價於:
var add = function(number)
{
alert(number + 20);
}
*/
function add(number, number1)
{
alert(number + 30);
}
/*
上面的函數等價於:
var add = function(number, number1)
{
alert(number + 30);
}
*/
add(10);
</script>
</head>
<body>
</body>
</html>
這樣add實際指向的是後面的對象,而方法調用的時候賦予的參數將會按順序賦給方法形式參數,後面沒有被賦值的參數就是undefined。
JavaScript的函數調用的時候沒有嚴格的參數個數檢查,實參個數小於形參個數是可以的,沒有被賦值的形參就是未定義值undefined。
實參個數大於形參個數也是可以的,這樣只有前面的實參會被使用,多出來的實參不會被使用。
Function對象
在JavaScript中有一個Function對象,所有自定義的函數都是Function對象類型的。
Function對象接收的所有參數都是字符串類型的,其中最後一個參數就是要執行的函數體,而前面的參數則是函數真正需要接收的參數。
例子:
代碼如下:
<html>
<head>
<script type="text/javascript">
var add = new Function("number", "number1", "alert(number + number1);");
var add = new Function("number", "alert(number + 20);");
add(10, 30);
</script>
</head>
<body>
</body>
</html>
隱含對象arguments
在JavaScript中,每個函數都有一個隱含的對象arguments,表示給函數實際傳遞的參數。
arguments和函數的形式參數及其個數無關。
arguments有個有用的屬性length,表示實參的長度。可以借助這個來模擬出函數的重載:
練習例子:
代碼如下:
<html>
<head>
<script type="text/javascript">
function add(number1, number2)
{
alert(arguments.length);
alert(arguments[0]);
alert(arguments[1]);
alert(arguments[2]);
}
//add(2, 3, 4);
function add2()
{
if(1 == arguments.length)
{
alert(arguments[0]);
}
else if(2 == arguments.length)
{
alert(arguments[0] + arguments[1]);
}
else if(3 == arguments.length)
{
alert(arguments[0] + arguments[1] + arguments[2]);
}
}
add2(3);
add2(3, 4);
add2(3, 4, 5);
</script>
</head>
<body>
</body>
</html>
每一個函數對象都有一個length屬性,表示該函數期望接收的參數格式。
它與函數的arguments不同,arguments.length表示函數實際接收的參數個數。
例子:
代碼如下:
<html>
<head>
<script type="text/javascript">
var add = function(num, num2, num3)
{
alert(num + num2 + num3);
}
alert(add.length); //輸出3
add(1, 2, 3);
var add2 = function()
{
}
alert(add2.length); //輸出0
</script>
</head>
<body>
</body>
</html>