「JavaScript設計得最出色的就是它的函數的實現。」 -- 《JavaScript語言精粹》編程
函數包含一組語句,它們是JS的基礎模塊單元,用於指定對象的行爲。通常來講,所謂編程,就是將一組需求分解成一組函數與數據結構的技能。數組
1.函數的功能數據結構
代碼重複性使用閉包
模塊化編程模塊化
2.語法:函數
使用函數前要先定義才能使用spa
函數定義有三個部分:函數名,參數列表,函數體設計
格式:code
1 function 函數名([參數1, 參數2, ...]){ 2 3 函數執行部分; 4 5 return 表達式; 6 7 }
例如:對象
1 <script> 2 function display(first,second){ 3 alert(first+second); 4 } 5 var i=10; 6 var j=20; 7 display(i,j); 8 </script>
在上面這個例子當中,first,second是形參,i,j是實參。
在函數執行過程當中,形參值得改變不會影響實參。(按值傳遞)
可是對象數據類型,是按引用傳遞(按地址傳遞),其餘數據類型都是按值傳遞。
好比,下面的例子,運行的結果是「aaa」
1 <script> 2 function display(obj){ 3 obj.name='aaa'; 4 } 5 var p= new Object(); 6 p.name = 'bbb'; 7 display(p); 8 alert(p.name); 9 </script>
3.關於函數的返回值問題
函數遇到return會當即返回,後面代碼不執行。
4.關於匿名函數
在JS當中每個變量,包括函數都算是一個對象,都佔據了內存地址。函數也是一種對象,佔據了內存地址。內存包括,堆內存,棧內存,靜態區和代碼段。通常來講,變量名保存到棧內存中,變量對象的數據保存帶堆內存當中。由於堆比棧大,但棧比堆快。函數會保存到內存當中的代碼段中。代碼段中的數據的引用是經過棧內存中的一個名字指向的。
1 <script> 2 //變量是能夠保存數據的,也能夠保存地址的 3 var i=10; 4 alert(i); 5 6 function display(){ 7 alert('123'); 8 } 9 10 i=display; //變量指向了這個函數的首地址 11 i(); //彈出123 12 </script>
在上面這個例子中,function display(){} 實際上是,在window對象下添加一個叫display的變量,它指向了這個函數的首地址。其中i=dispaly的意思就是,咱們讓window對象下的i指向這個函數的首地址。
匿名函數的用法
1 <script> 2 //匿名函數的前期 3 var i=function display(){ 4 alert('123'); 5 } 6 i(); 7 8 //匿名函數的用法 9 var j=function(){ 10 alert('123'); 11 } 12 j(); 13 </script>
5.自調用匿名函數
格式: (function(){})();
function(){} : 至關於返回首地址
(function(){}) : 把這部分看做是一個總體
(function(){})() : 至關於找到這個地址並執行
1 <script> 2 //自調用匿名函數 3 (function(){ 4 alert('111'); 5 })(); 6 7 //帶參數的自調用匿名函數 8 (function(para){ 9 alert(para); 10 })(222); 11 </script>
自調用匿名函數的好處是,避免重名,自調用匿名函數只會在運行時執行一次,通常用於初始化。
6.全局變量與局部變量
1 <script> 2 i=10; //全局變量 3 var j=20; //全局變量 4 function display(){ 5 var k=30; //局部變量 6 P=40; //全局變量 7 } 8 </script>
在函數內定義的就是局部的,不然就是全局的。局部變量只在局部做用域起做用。若是函數內的變量沒有var聲明,會直接影響全局的。
機制:在JS中,若是某個變量沒有var聲明,會自動到上一層做用域中去找這個變量的聲明語句,若是找到,就使用,若是沒找到,繼續向上查找,一直查找到全局做用域爲止。若是全局中仍然沒有這個變量的聲明語句,那麼會自動在全局做用域進行聲明,這個就是JS中的做用域鏈。
局部訪問全局經過做用域鏈,全局訪問局部要經過閉包。
7.arguments的使用
在一個函數內部,可使用arguments屬性,它表示函數的形參列表,是以數組形式體現的。
在定義一個函數的時候,它的實參個數必需要與形參個數保持一致,有時,咱們定義函數時,形參數目不能固定,這個時候就要使用arguments。
1 <script> 2 function showname(){ 3 //沒有定義形參,那麼全部形參會自動存放到arguments這個屬性數組中 4 for(var i=0;i<arguments.length;i++){ 5 document.write(arguments[i] + '<br>'); 6 } 7 } 8 showname('zhangsan','lisi','wangwu'); 9 </script>
沒有定義形參,那麼全部形參會自動存放到arguments這個屬性數組中。