學(xué)習(xí)知識(shí)難免會(huì)忘記,關(guān)鍵是在忘記之后,下次遇到時(shí)能夠通過快捷的方法來回憶,并盡量達(dá)到忘記之前的狀態(tài)。總結(jié)也許是日后回憶的一種有效方法,前些日子看了javascript的function,總結(jié)如下:

學(xué)習(xí)function重要的就是明白當(dāng)程序運(yùn)行到函數(shù)聲明的時(shí)候,并不執(zhí)行該函數(shù),當(dāng)其他函數(shù)調(diào)用所聲明的函數(shù)時(shí),該函數(shù)才被執(zhí)行,也就是英文說的function is complied,but not executed until you call it.

再有就是函數(shù)在聲明時(shí)創(chuàng)建變量。例如function(){}就創(chuàng)建了一個(gè)變量,雖然這個(gè)變量是匿名的。

js 代碼
  1. var a=function(){};   
  2.   
  3. var a=function(x,y){}(1,2);   

第一條語(yǔ)句是定義一個(gè)匿名function,并將該函數(shù)賦給a變量。第二條語(yǔ)句是定義一個(gè)匿名function,并調(diào)用將該函數(shù)的返回結(jié)果賦值給a變量。

function add(a,b){};則是定義了一個(gè)function,該function的名字是add,相當(dāng)于一個(gè)名為add的變量指向該function。

看看以下代碼,感覺挺有意思:

js 代碼
  1. function myFunction(){alert("Old");};   
  2.   
  3. var savedFunction=myFunction;   
  4.   
  5. myFunction=function(){alert("New");};   
  6.   
  7. myFunction();   //prints"New"   
  8.   
  9. savedFunction(); //prints"Old"   

在調(diào)用myFuction函數(shù)的時(shí)候,打印出New字符串,代碼的第二行明確指出savedFunction=myFunction,但是在調(diào)用 savedFunction的時(shí)候會(huì)出現(xiàn)Old字符串,這種情況應(yīng)該引起java同行的注意,在javascript中,指針指向的是代碼片段,執(zhí)行第二 行的時(shí)候,savedFucntion指向的是myFuction所指向的代碼片段 myFunction code(第一行),然而在第三行myFunction指針由先前的代碼片段myFunction code改變?yōu)榇a片段function(){alert("New")} code的時(shí)候,先前的代碼片段仍然未消失,被savedFunction所指向,這也就解釋了為什么最后程序打印出的字符串仍是Old。

對(duì)于Function關(guān)鍵字來說僅在特殊情況下用到,一般就用function,這里就不再介紹了。

prototype屬性對(duì)于初學(xué)js的人來說比較迷惑,這里大致的總結(jié)如下:

一般的變量沒有prototype屬性,constructor function有prototype屬性,也就是聲明的function(){}變量,js中的每個(gè)對(duì)象都有一個(gè)_proto_和 constructor屬性,如果一個(gè)對(duì)象由constructor function生成,例如:

js 代碼
  1. function Ball(message){   
  2.   
  3. alert(message);   
  4.   
  5. };   
  6.   
  7. var ball0=new Ball("executing");   

解釋以下,最后一行代碼等同于:

js 代碼
  1. var ball0=new Object();   
  2.   
  3. ball0.construct=Ball;//將屬性construct指向代碼片段Ball code   
  4.   
  5. ball0.construct("executing"); //執(zhí)行該代碼片段   

接著說,如果一個(gè)對(duì)象由constructor function生成,則該對(duì)象ball0的_proto_屬性指向它的構(gòu)造函數(shù)的prototype屬性,也就是指向constructor function(這里是前三行代碼)所具有的prototype屬性,因此凡是用該constructor function生成的對(duì)象,都帶有該function的prototype屬性。