函式 Function
- 詳細內容
- 分類:Javascript
- 發佈:2013-06-06, 週四 00:33
- 點擊數:3159
Javascript的函式(Function):
在Javascript中,"函式是個物件",就像是一般物件一樣,差別是他可以被呼叫。函式可以用來完成某種特殊功能,或是用來處理資料。在任何一種語言當中函式都是不可或缺的重要腳色。
下面是一個簡單的Javascript函式,當它被呼叫時。會跳出一個對話方塊,顯示一段歡迎字串。
function hellowWorld(){ alert("嗨!歡迎來到Javascript的世界"); } hellowWorld(); // 呼叫該函式
函式的建立:
在Javascript中,建立函式的方法有三種。
- 函式宣告式(function declaration)
- 函式建構式
- 函式實字(function literal)或稱之為函式表達式(function expression)
函式宣告式:
函式宣告式是最像其他語言建立函式時所使用的方法。如果你學習過其他種的程式語言,那對這種建立函式的方法一定能相當的熟悉。
語法:
function funname(param1,param2,.......paramX){ some codes }
以函式宣告式建立的函式,在載入時會被解析一次,然後就可以在程式中被重複的利用。通常比較少會有記憶體漏洞之類的問題。
函式建構式:
函式是個物件,所以也能像建立物件一樣來建立函式。也就是使用new 與建構子來建立函式。函式建構式是在執行階段進行的,因此每一次呼叫都要重新建構一次。
語法:
var funname=new Function("param1","param2",...."paramX","function content");
用此方法來實作一下前面的範例:
var hellowWorld=new Function("alert(\"嗨!歡迎來到Javascript的世界\");"); hellowWorld();//呼叫該函式
這範例沒有輸入參數,只有函式的主體部分==>"alert(\"嗨!歡迎來到Javascript的世界\")",從語法與範例中都可以看出,new Function所使用的參數是字串,在字串中要使用"號,可以加入在前面加入跳脫字元\。
重點來了,也因為此種建立函式的方法會把字串當成指令碼來執行,使得這種建立函式的方法充滿了危險性(就像是萬惡的eval一樣),若沒有特殊情形,通常都不建議使用這種方法來建立函式。特別是不要把使用者所輸入字串當作new Function的參數,因為完全無法預期使用者是否輸入了其他非法意圖的程式碼。這很危險。
附註一提,在歐萊禮出版的JavaScript學習手冊中提到,此種函式建立方式也可稱之為匿名函式,不過似乎更多人把函式實字或函式表達式稱之為匿名函數。在另一本歐萊禮出版的JavaScript設計模式中就是如此。
函式實字(function literal)或稱之為函式表達式(function expression):
函式實字就像是字串實字一樣,能直接把函式指定給變數使用而不經過宣告或是建構式。
語法:
var funname1=function funname2(param1,param2,.....paramX){ some codes }
funname2可有可無,它會影響到function的name屬性,有時候很有用,不過也可以不理它。事實上funname2的存在在某些瀏覽器版本並不能正確運作,因此不用也好。少了funname2的函示,有時候會被稱之為匿名函式(這名字也太廣泛使用了吧...)
函式實字很好用,事實上在建立物件方法時,函示實字是個很常用的方式。
建立一個player物件,包含一個getname()方法:
var player={ name:"Vic", getname:function(){ return this.name; } };
函式的屬性:
屬性 | 說明 |
---|---|
length 是函式物件(對象)的屬性,此屬性用來取得函式物件預定收到的參數值。 | |
arguments是函式物件的屬性,與函數的輸入參數有關,不過這屬性已經廢棄。不再使用。請參考 arguments物件作為代替。 |
函式的方法:
方法 | 說明 |
---|---|
apply是函式物件的方法,可以用來呼叫函式,並且指定函式內 this 的值。apply方法會將原函式的參數以陣列方式表示,在ECMAScript 5中,也可以是個類似陣列的物件, | |
Function.prototype.call是函式物件的方法,用來呼叫函式,與一般呼叫函式的方式不同的地方是,call方法可以指定函式中的this值。 |
其他函式相關觀念與研究:
有許多函式相關的觀念與用法,以後會陸續補上。
hoisting 中文是提升的意思。
在 javascript 中 hoisting 指的是 " 一種把宣告提升到其所在區域內頂端的行為"。
意思是,可以在宣告變數前就使用變數。
不過提升行為僅僅只針對宣告部分,對於變數的指定,並沒有跟著被提升。
即函是是Javascript中一種可以立即執行的函式,其本質其實是個函式表示式。
何時該使用立即函式?
如果你有一段程式碼,只被執行一次,或許就該考慮使用立即函式將程式碼包裹起來,
這樣做有幾個好處。1.全域變數的減少:2.全域變數區域化:
函式的參數是用來與程式本體進行資料傳遞使用。一般傳遞參數的方式分為傳址或傳值。
但Javascript不像C一樣,有特殊的運算子來決定傳值 或傳址。而是以資料型態作為依據。
遞迴是一種函式在函式本體內呼叫自己的程式設計技巧。遞迴是一種很"直觀"的設計技巧。
會這麼說是因為有些特殊例子使用其他演算法,像是迴圈來解釋的話會十分複雜,
但使用遞迴的話,演算法就會變得很直觀。
5.回呼函式
所謂的回呼函式其實就是 " 將函式當作另一個函式的參數,由另外的函式來呼叫 "。
回呼函式其實十分常見,譬如在Javascript中監聽事件的添加,
setTimeout 與 setInterval,或是陣列物件中的filter。
閉包(Closure)算是在Javascript中比較高階的應用了,不過它基礎其實也不算太難懂。
只是用起來很可以複雜XD。閉包其實也是函式,
不過它比較特的的是它擁有一組特殊的環境變數--本來以為應該消失,可是卻依然存在的變數。
按個讚!~支持本站!~