1. 程式人生 > >JavaScript Function、函式宣告、函式表示式

JavaScript Function、函式宣告、函式表示式

什麼是函式

所謂函式,本質上上i 一種程式碼的分組形式,我們可以通過這種形式賦予某組程式碼一個名字,以便於之後的呼叫。( 函式也是資料 可以將函式視為一種特殊的資料型別 )
栗子:

function sum(a,b){
    var c = a + b ;
    return c;
}

一般來說,函式宣告通常由以下幾部分組成。

  • 關鍵詞 function
  • 函式名,即這裡的 sum
  • 函式所需要的引數,即這裡的 a,b 。一個函式通常都具有 0 個或多個引數,引數之間用逗號分割。
  • 函式所要支援的程式碼塊,我們稱之為函式體
  • return 之句。函式通常都會由返回值,如果某個函式沒有返回值,我們通常預設為 undefined。
    PS: 一個函式只有一個返回值 ,如果需要返回多個值 ,我們可以存陣列或者物件形式 返回!

呼叫函式

現在,我們來呼叫下 sum() 函式。先將兩個引數傳遞改函式,然後再將函式的返回值複製給函式的result,具體如下:

var result = sum(1,2);
result;   // 3

1:Function 物件

Function 構造器會建立一個新的 Function 物件。 在 JavaScript 中每個函式都是一個 Function 物件。沒有物件 new 一個 !

// 使用 Function 建構函式建立函式
new Function ([arg1[, arg2[, ...argN]],] functionBody)

例子:

var func = new
Function('a', 'b', 'return a + b'); func(2, 3) // 5

使用 Function 構造器生成的 Function 物件是在函式建立時解析的。
這比你使用函式宣告或者函式表示式(function)並在你的程式碼中呼叫更為低效,因為使用後者建立的函式是跟其他程式碼一起解析的。
所以不推薦使用 Function 建構函式來建立函式。

2:函式宣告 function statement

函式宣告是用指定的引數宣告一個函式。一個被函式宣告建立的函式是一個 Function 物件,具有 Function 物件的所有屬性、方法和行為。

// 函式宣告語法
function name([param[, param[, ... param]]]) { statements }
  • name: 函式名,可以省略。當省略函式名的時候,該函式就成為了匿名函式。
  • param: 傳遞給函式的引數的名稱,一個函式最多可以有255個引數。
  • statements: 組成函式體的宣告語句。

3:函式表示式 function expression

在函式表示式中我們可以忽略函式名稱建立匿名函式,並將該匿名函式賦值給變數。

var add = function(a, b) {
    return a + b;  
};

add(2, 3) // 5

當然, 也可以建立命名函式表示式 Named function expression:

var add = function func(a, b) {
    return a + b;  
};

add(2, 3) // 5

命名函式表示式中函式名稱只能作為函式體作用域內的區域性變數,外部不可訪問。

var a = function pp(v) {
    v++;
    if (v>3) {
        return v;
    } else {
        return pp(v);
    }
}

a(1); // 4
pp(1); // ReferenceError: pp is not defined

4:函式宣告提升

PS: JavaScript 變數提升

對於函式宣告建立的函式,可以在本作用域內任意位置訪問。

a(); // 1

function a() {
    return 1;  
}

a(); // 1

而函式表示式不會。

console.log(a); // undefined (只是變數提升)
a(1); // TypeError: a is not a function

var a = function(v) {
    console.log(v);     
};

5:實參與形參

呼叫函式時,傳遞給函式的值被稱為函式的實參(值傳遞),對應位置的函式引數名叫作形參。有一點非常需要注意:

  • 如果實參是一個包含原始值(數字,字串,布林值)的變數,則就算函式在內部改變了對應形參的值,返回後,該實參變數的值也不會改變。
  • 如果實參是一個物件引用,則對應形參會和該實參指向同一個物件。假如函式在內部改變了對應形參的值,返回後,實參指向的物件的值也會改變。

    實參是原始值:

function func(v) {
    v = 3;
}

var a = 1;
func(a);
console.log(a); // 1

實參是物件引用(1):

function func(v) {
    v.c = 3;
}

var a = {
    b: 1,
    c: 2
};

func(a);
console.log(a); // { b: 1, c: 3 }

實參是物件引用(2):

function func(v) {
      v[1] = 3;
}

var a = [1, 2];

func(a);
console.log(a); // [ 1, 3 ]

6:arguments 物件

arguments 物件是函式內部的區域性變數,是一個類陣列物件,代表傳給一個 function 的引數列表。

function func(a, b) {
    console.log(arguments);
}

func(22, 33); // { '0': 22, '1': 33 }
console.log(arguments[0]); // 22
console.log(arguments.length); // 2

注意: arguments 物件並不是一個真正的 Array。它類似於陣列,但沒有陣列所特有的屬性和方法,除了 length。例如,它沒有 pop 方法。
如果需要,可以將其轉換成陣列再對新的陣列進行處理

例如:

var args = Array.prototype.slice.call(arguments);