學習知識難免會忘記,關鍵是在忘記之后,下次遇到時能夠通過快捷的方法來回憶,并盡量達到忘記之前的狀態。總結也許是日后回憶的一種有效方法,前些日子看了javascript的function,總結如下:
學習function重要的就是明白當程序運行到函數聲明的時候,并不執行該函數,當其他函數調用所聲明的函數時,該函數才被執行,也就是英文說的function is complied,but not executed until you call it.
再有就是函數在聲明時創建變量。例如function(){}就創建了一個變量,雖然這個變量是匿名的。
- var a=function(){};
- var a=function(x,y){}(1,2);
第一條語句是定義一個匿名function,并將該函數賦給a變量。第二條語句是定義一個匿名function,并調用將該函數的返回結果賦值給a變量。
function add(a,b){};則是定義了一個function,該function的名字是add,相當于一個名為add的變量指向該function。
看看以下代碼,感覺挺有意思:
- function myFunction(){alert("Old");};
- var savedFunction=myFunction;
- myFunction=function(){alert("New");};
- myFunction(); //prints"New"
- savedFunction(); //prints"Old"
在調用myFuction函數的時候,打印出New字符串,代碼的第二行明確指出savedFunction=myFunction,但是在調用 savedFunction的時候會出現Old字符串,這種情況應該引起java同行的注意,在javascript中,指針指向的是代碼片段,執行第二 行的時候,savedFucntion指向的是myFuction所指向的代碼片段 myFunction code(第一行),然而在第三行myFunction指針由先前的代碼片段myFunction code改變為代碼片段function(){alert("New")} code的時候,先前的代碼片段仍然未消失,被savedFunction所指向,這也就解釋了為什么最后程序打印出的字符串仍是Old。
對于Function關鍵字來說僅在特殊情況下用到,一般就用function,這里就不再介紹了。
prototype屬性對于初學js的人來說比較迷惑,這里大致的總結如下:
一般的變量沒有prototype屬性,constructor function有prototype屬性,也就是聲明的function(){}變量,js中的每個對象都有一個_proto_和 constructor屬性,如果一個對象由constructor function生成,例如:
- function Ball(message){
- alert(message);
- };
- var ball0=new Ball("executing");
解釋以下,最后一行代碼等同于:
- var ball0=new Object();
- ball0.construct=Ball;//將屬性construct指向代碼片段Ball code
- ball0.construct("executing"); //執行該代碼片段
接著說,如果一個對象由constructor function生成,則該對象ball0的_proto_屬性指向它的構造函數的prototype屬性,也就是指向constructor function(這里是前三行代碼)所具有的prototype屬性,因此凡是用該constructor function生成的對象,都帶有該function的prototype屬性。