首頁 Javascript General Javascript中的函數:基本使用
Javascript中的函數:基本使用 列印 填寫電子郵件
(1 位用戶參與評分, 當前平均得到 5.00 顆星星)
Javascript / General / Eddy Chang / 週一, 21 九月 2009 18:44
函數宣告方式

在Douglas Crockford的「Javascript: The Good Parts」書中,在函數的章節,開宗明義的就說「Functions in JavaScript are objects」。函數本身就是一種物件,和物件的連繫也是密不可分。因為函數是物件,所以也可以存放於變數、物件或陣列之中。在這本書中建議的函式使用方式,都是像下面第二種這樣的:
//一般的函數定義方式
  function add(a,b){
  return a + b;  
  };  
  
  //稱為function literal notation的函數定義方式
  var add = function (a, b) {      
            return a + b;  
  };  
//使用add函數相加兩個數
 var sum=add(1,2);
 //像數值一樣,函數也可以指定(複製)給別的變數
 var sum=add;
 typeof sum;
 
 //刪除add函數之後,sum函數還存在
 delete add;
 typeof sum;
 var result=sum(2,3);

當然函數的宣告方式有很多種,這一種是需要學習的部份,或許這和其他程式語言有些差異。

接下來要了解的是每個函數都有一個自動內建的參數陣列,稱為arguments。像在下面的範例中,可以看到它的功用,利用arguments可以傳入不確定數量的參數值。但是,arguments並不是一個真正的陣列,雖然它有length的屬性,這個部份之後再討論。
function sumOnAll() { 
  var total=0;
  for (i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total; 
} 

sumOnAll(1,2,6);
sumOnAll(1,1,2,6,7); 
匿名函數

沒有名稱的函數稱為匿名函數,匿名函數在適當的使用處會產生以下的用處:1.)減少全域變數的使用 2.)少寫一些程式碼 3.)提高效率。
最常見的匿名函數的使用是在於callback(回調函數)中,回調函數的意義是:一段可執行的程式碼,用於傳入另一個函數當成傳入參數來使用。在Object-Oriented Javascript一書中的callback範例如下:

function addOne(a) {
  return a + 1;
}

function multiplyByTwo(a, b, c, callback) {
  var i, ar = []; 
  for(i = 0; i < 3; i++) {
    ar[i] = callback(arguments[i] * 2);
  } 
  return ar;
}
//直接將函數名稱傳入
myarr = multiplyByTwo(1, 2, 3, addOne);
//直接用匿名函數當作參數
myarr = multiplyByTwo(1, 2, 3, function(a){return a + 1});

一般的函式也可以使用callback改寫,用typeof來判斷此時傳入的函數是否是一個函數,如果是的話可以執行它。
function something_cool(text, callback){
    alert(text);
    if(typeof(callback)=='function'){ 
        callback(); 
    };
}


另一個匿名函數的應用是Self-invoking(自我調用)的函數,這種函數在宣告處會執行,而且只能執行一次,一般用在初始化或只需執行一次的任務,知名的JQuery函式庫的Plug-in的寫法就是使用自我調用的函數。
(function(name) {
		alert('Hello ' + name);
	}
)('Eddy');

用function literal notation的函數定義自我調用的函數
var a = function(name) {
  alert('Hello ' + name);
}('Eddy');
內部(私有)函數

由於函數在Javascript語言中就如同其他的數值一樣,當然也可以在函數中定義其他函數。這種內部的函數稱為內部函數(inner function)或私有函數(private function)。內部函數也可以保持全域命名空間的乾淨,減少全域變數的污染。另外這種作法也可以區分出要暴露在外部給其他成員使用的函數,以及內部使用的函數。
var a = function(param) {
  var b = function(input) {
    return input * 100;
  };
  return 'The result is' + b(param);
};

a(2); //結果為 The result is 200

b(3); //函數b在外面是無法存取的

函數回傳值

函數均會有回傳值,如果沒有回傳值的程式碼部份(即用return回傳的數值),則視回傳值為undefined,當return程式碼被執行後,函數就會停止執行剩下的程式碼,所以return可以用來作提前的返回敘述。函數的回傳值也可以是另一個函數,當使用了函數作為回傳值之後,如果有另一變數指定了這個函數,這個變數會變成回傳的那個函數。像以下這樣的程式碼:

var a = function(name) {
  alert("Hello "+name)
  var b = function(name2) {
    alert("GoodBye "+name2);
  };
  return b;
};

a("Eddy"); //Hello Eddy
var c=a(); //注意此時c會變成函數b的內容
c("David"); //Goodbye David
a("Ben")("Ken"); //Hello Ben與Goodbye Ken

a=a(); //覆寫a函數的內容變為b函數的內容
a("Eddy") //Goodbye Eddy


評論:

新增回應


驗證碼
更新

關於我something about me

eddy

Eddy Chang

Joomla!台灣站長、資擘(股)軟體工程師

最新留言Latest Comment