1. 程式人生 > >原生js函數的偽重載

原生js函數的偽重載

span 實現 fun html js函數 con 內存 定義函數 body

一、我們在學習java的時候,其中方法有一個比較的重要的特性重載,根據傳入的參數的個數來執行不同的方法,而方法其根據簽名來判斷,而JavaScript卻不能根據方法的簽名來進行重載,只能通過參數的個數的來進行實現偽重載。

在函數體中有個對象arguments,記錄調用函數的傳入的參數的對象:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5 </head>
 6 <body>
 7 <script type="text/javascript
"> 8 function reloadFunc(ar1,ar2,ar3){ 9 console.log(arguments); 10 console.log(typeof arguments); 11 }; 12 reloadFunc(a,b) 13 </script> 14 </body> 15 </html>

輸出:

1 Arguments(2) ["a", "b", callee: ?, Symbol(Symbol.iterator): ?]0: "a"1: "b"
callee: ? reloadFunc(ar1,ar2,ar3)length: 2Symbol(Symbol.iterator): ? values()__proto__: Object

我們可以在定義函數函數的不顯示的顯示參數,通過傳入arguments的長度來判斷參數。

 1     function reloadFunc(){
 2         switch(arguments.length){
 3             case 1:
 4             console.log("一個參數!");
 5             break;
 6             case
2: 7 console.log("兩個參數!"); 8 break; 9 case 3: 10 console.log(三個參數!); 11 break; 12 default: 13 console.log(未傳入參數!) 14 } 15 }; 16 reloadFunc(a,b); 17 reloadFunc(); 18 reloadFunc(1,2,3)

等同於:

 1 <script type="text/javascript">
 2     function reloadFunc(ar1,ar2,ar3){
 3         switch(arguments.length){
 4             case 1:
 5             console.log("一個參數!");
 6             break;
 7             case 2:
 8             console.log("兩個參數!");
 9             break;
10             case 3:
11             console.log(三個參數!);
12             break;
13             default:
14             console.log(未傳入參數!)
15         }
16     };
17     reloadFunc(a,b);
18     reloadFunc();
19     reloadFunc(1,2,3)
20 </script>

註意:1、當我們顯示定義了參數之後,如果傳入的參數個數小於我們顯示定義參數,默認缺省參數為undefined的。

   2、arguments的對象和函數的參數是不同的內存空間,我們可以通過arguments修改參數。

   3、通過arguments修改參數的時候,可以反射對應的變量,但是arguments的長度在調用該函數的時候,就已經決定了。如果我們修改arguments的不存在的索引的變量值並不能反射到對應變量,依然是undefined的:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title></title>
 5 </head>
 6 <body>
 7 <script type="text/javascript">
 8     function reloadFunc(ar1,ar2,ar3){
 9         arguments[3]=2;
10         console.log(ar3);
11     };
12     reloadFunc(a,b);
13 </script>
14 </body>
15 </html>

輸出:

1 undefined

我們可以通過下標訪問arguments對象:

1 <script type="text/javascript">
2     function reloadFunc(ar1,ar2,ar3){
3             console.log(arguments);
4             console.log(typeof arguments);
5             console.log(arguments[0],arguments[1])
6     };
7     reloadFunc(a,b)
8 </script>

我們可以通過判斷該對象的長度來進行方法的重載。

 1 <script type="text/javascript">
 2     function reloadFunc(ar1,ar2,ar3){
 3         switch(arguments.length){
 4             case 1:
 5             console.log("一個參數!");
 6             break;
 7             case 2:
 8             console.log("兩個參數!");
 9             break;
10             case 3:
11             console.log(三個參數!);
12             break;
13             default:
14             console.log(未傳入參數!)
15         }
16     };
17     reloadFunc(a,b);
18     reloadFunc();
19     reloadFunc(1,2,3)
20 </script>

輸出:

1 兩個參數!
2 函數重載.html:20 未傳入參數!
3 函數重載.html:17 三個參數!

我們可以判斷傳入的參數的長度來決定一個執行的不同的代碼塊。實現類似的java的偽重載。

原生js函數的偽重載