2017年12月25日 星期一

[ JavaScript Gossip ] JavaScript 核心 : 一切都與函式有關 (函式宣告)

Source From Here 
前言 : 
對於要重複執行的內容,你可以定義函式. 例如 : 
> function max(num1, num2) {
> return num1 > num2 ? num1 : num2;
> }

> max(10, 5);
10

在上面的例子示範了函式的基本宣告與呼叫方式. 函式使用 function 宣告名稱,參數位於括號之中,使用 return 傳回執行結果,如果沒宣告return傳回任何結果,預設傳回undefined

函式宣告介紹 : 
在函式上的參數宣告,只是傳入引數的具名參考,實際上,宣告函式時若傳入的引數少於參數是可行的,不足的部份,參數就是undefined : 
> function func(a, b) { console.log(a); console.log(b) }
> func(10, 20);
10
20

> func(10);
10
undefined

> func();
undefined
undefined

> func(10, 20, 30, 40); // 給超過參數定義的引數
10
20

在上例中,你也看到了,就算傳入比參數個數還多的引數也是可行的,那多的引數跑到哪去了?事實上,在函式內部會自動宣告 arguments 名稱參考至具陣列外觀的物件,上頭帶有所有傳入的引數. 例如,你可以如下設計一個加總數值的函式 : 
> function sum(){ var sum=0; for(var j=0; j
> sum(1, 2);
3
> sum(1, 2, 3);
6
> sum(1, 2, 3, 4);
10

arguments 不是 Array 實例,它只是具有數字作為特性,特性參考至傳入的引數,並具有 length 特性代表傳入引數的個數. 在 JavaScript 中,參數只是具名的引數,事實上,你改變參數的值,arguments 對應索引的參考值也會相應的改變 : 
js> function func(a, b) {
> print(a + ': ' + arguments[0]);
> print(b + ': ' + arguments[1]);
> a = 0;
> b = 0;
> print(a + ': ' + arguments[0]);
> print(b + ': ' + arguments[1]);
> }

js> func(100, 200);
100: 100
200: 200
0: 0
0: 0

由於呼叫函式時傳入的引數個數不一定要等於參數個數,因此若要確認引數等於參數個數,可透過 arguments 的 length 來檢查傳入的引數個數. 例如 : 
> function func(a, b){ if(arguments.length!=2) { throw new Error('must give 2 arguments'); } }
> func(10);
js: "", line 40: exception from uncaught JavaScript throw: Error: must give 2 arguments
at :40 (func)
at :39

事實上,在 JavaScript 程式設計上的慣例,很少檢查引數個數,而是在引數不足時提供預設值,這很容易辦到,因為引數不足時,不足的參數會是 undefined,而 undefined 在判斷式中會被當 false,所以可以撰寫如下來提供預設值 : 
> function numberGenerator(length, begin, step) {
> begin = begin || 0;
> step = step || 1;
> var numbers = [begin];
> length--;
> for(var j = 0; j < length; j++) {
> numbers.push(numbers[j] + step);
> }
> return numbers;
> }

> numberGenerator(10);
0,1,2,3,4,5,6,7,8,9
> numberGenerator(10, 5);
5,6,7,8,9,10,11,12,13,14
> numberGenerator(10, 5, 2);
5,7,9,11,13,15,17,19,21,23

在上例是一個數值產生器,length 一定要提供,若不提供 begin 的話,預設起始值就是 0,若不提供 step 的話,步進值就是1. 
如果在選項非常多時,還會採用選項物件(Option object)的方式. 例如 : 
> function func(option) {
> option = {
> x : option.x || 10,
> y : option.y || 20,
> z : option.z || 30
> };
> print(option.x);
> print(option.y);
> print(option.z);
> }

> func({ x : 100 });
100
20
30

> func({ x : 100, y : 200 });
100
200
30

> func({ x : 100, y : 200, z : 300 });
100
200
300

在上例中,呼叫函式時必須提供物件,物件上帶有函式所需的資料,函式內部對於物件上沒有提供資料時,會提供預設值.

沒有留言:

張貼留言

[ Python 常見問題 ] How to shift a datetime object by 12 hours in python

Source From   Here   Question   Datetime   objects hurt my head for some reason. I am writing to figure out   how to shift a date time obje...