函式 Function

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

length 是函式物件(對象)的屬性,此屬性用來取得函式物件預定收到的參數值。

arguments

arguments是函式物件的屬性,與函數的輸入參數有關,不過這屬性已經廢棄。不再使用。請參考 arguments物件作為代替。

函式的方法:

方法 說明

apply

apply是函式物件的方法,可以用來呼叫函式,並且指定函式內 this 的值。apply方法會將原函式的參數以陣列方式表示,在ECMAScript 5中,也可以是個類似陣列的物件,

call

Function.prototype.call是函式物件的方法,用來呼叫函式,與一般呼叫函式的方式不同的地方是,call方法可以指定函式中的this值。

其他函式相關觀念與研究:

有許多函式相關的觀念與用法,以後會陸續補上。

1. 粗談hoisting...

    hoisting 中文是提升的意思。

    在 javascript 中 hoisting 指的是 " 一種把宣告提升到其所在區域內頂端的行為"。

    意思是,可以在宣告變數前就使用變數。

    不過提升行為僅僅只針對宣告部分,對於變數的指定,並沒有跟著被提升。

2.立即函式(IIFE)

   即函是是Javascript中一種可以立即執行的函式,其本質其實是個函式表示式。

   何時該使用立即函式?

   如果你有一段程式碼,只被執行一次,或許就該考慮使用立即函式將程式碼包裹起來,

   這樣做有幾個好處。1.全域變數的減少:2.全域變數區域化:

3.函式的參數--傳值或傳址

   函式的參數是用來與程式本體進行資料傳遞使用。一般傳遞參數的方式分為傳址或傳值。

   但Javascript不像C一樣,有特殊的運算子來決定傳值     或傳址。而是以資料型態作為依據。

4.遞迴(Recursion)

   遞迴是一種函式在函式本體內呼叫自己的程式設計技巧。遞迴是一種很"直觀"的設計技巧。

   會這麼說是因為有些特殊例子使用其他演算法,像是迴圈來解釋的話會十分複雜,

   但使用遞迴的話,演算法就會變得很直觀。

5.回呼函式

   所謂的回呼函式其實就是 " 將函式當作另一個函式的參數,由另外的函式來呼叫 "。

   回呼函式其實十分常見,譬如在Javascript中監聽事件的添加,

   setTimeout 與 setInterval,或是陣列物件中的filter。

6.閉包(Closure)的基本概念

   閉包(Closure)算是在Javascript中比較高階的應用了,不過它基礎其實也不算太難懂。

   只是用起來很可以複雜XD。閉包其實也是函式,

   不過它比較特的的是它擁有一組特殊的環境變數--本來以為應該消失,可是卻依然存在的變數。

 
 

  按個讚!~支持本站!~

FB推薦載入中