| Javascript中的函數:基本使用 |
|
|
| Javascript / General / 週一, 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
評論: |

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