函數細節

 1 <script>
 2         //有參函數與無參函數
 3         /*無參函數*/
 4         function add(){
 5             var a = 10;
 6             var b = 20;
 7             var c = a + b;
 8             console.log(c);
 9         }
10         add();
11 
12         /*有參函數*/
13         function add2(d,e){
14             var f = d + e;
15             console.log(f);
16         }
17         // add2(11,22);
18         // var a = +prompt("第一個加數");
19         // var b = +prompt("第二個加數");
20         // add2(a,b);
21 
22         // 如果實參少於形參,沒被賦值的形參就是undefined,可以在函數內部給他默認一個值,比如用if語句判斷一下,給他賦值。
23         // 如果實參多於形參,正常情況下多餘的實參會被忽略掉;
24         // 如果不想被忽略掉,想得到多餘的實參,並參與運算怎麼辦?
25         // 需要藉助函數內部的特殊對象:arguments    這是內置的對象(此對象是一個類數組對象:他是一個對象。
26         // 但是他的用法有點像數組,所以稱之為類數組對象),只能在函數內部使用,外部無法使用
27 
28         /*不定長參數的函數*/
29         function add3(){
30             var sum = 0;
31             for (var i = 0; i < arguments.length; i++){
32                 sum += arguments[i];
33             }
34             return sum;
35         }
36 
37         var g = add3(1,2,3,4);
38         console.log(g);
39 
40         function add4(h, k){
41             console.log(h, k);  //3  5
42             console.log(arguments[0], arguments[1]);  //3  5
43             h = 22;
44             console.log(h, k);  //22  5
45             console.log(arguments[0], arguments[1]);  //22  5
46             //結論:arguments對象的數據和形參之間是相互映射的關係,兩者指向同一個地址空間,任何一方發生改變,都會影響另一方跟著改變。
47         }
48 
49         add4(3,5,6,7,8,9);
50 
51 
52 
53         // 函數的重載:即同一個作用域下的兩個同名函數。(在兩個不同文件中出現同名函數,只要他們不整合到一起,就沒有影響)
54         /*
55         在很多程式語言中,在同一個作用域中允許出現兩個或多個同名不同參的函數,且互不影響,這種現象叫重載。
56         但是在JavaScript中,如果出現兩個或多個同名函數(不論參數的個數是否相同),後面的都會覆蓋前面的同名函數。
57         */
58         function welcome(){
59             console.log("Hello!!!!!!");
60         }
61 
62         function welcome(name){
63             console.log("Hello",name);
64         }
65 
66         welcome();  //Hello undefined
67         welcome("小明");  //Hello 小明
68 
69 
70 
71         //作用域
72         /*
73         ES5中只存在兩種變數的作用域:(即可使用的範圍)
74         1、全局變數     函數外部
75         2、局部變數     函數內部
76             最佳實踐:盡量減少全局變數,避免命名衝突。因為如果兩個人在同一個腳本的
77         不同函數中使用了相同的全局變數名,就很容易導致不可預測的結果和難以察覺的 bug。
78             一定記得使用 var 聲明變數,避免一個變數未經聲明就來使用。否則即使是在函數內部,變數也會自動提升為全局變數。
79         */
80         var hi = "Hello";
81         function come(){
82             var msg = "Hello!!!";
83             console.log(msg);  //ok,沒問題。可訪問的
84             console.log(hi);  //ok,沒問題。可訪問的
85         }
86 
87         come();
88         console.log(hi);  //沒問題,可訪問的
89         console.log(msg);  //報錯,不可訪問的
90         //結論:變數查找原則:就近原則。 如果找不到,就向其父級作用域尋找,直到找到全局作用域還沒找到就報錯。
91         //      變數訪問:裡面可以訪問到外面,外面無法訪問裡面。
92         //      相同作用域下定義同名變數,後面的會覆蓋掉前面的。  不同作用域下定義同名變數,互不影響。
93     </script>