JavaScript ES6 Arrow Functions(箭頭函數)


 

1. 介紹

第一眼看到ES6新增加的 arrow function 時,感覺非常像 lambda 表達式。

那么arrow function是干什么的呢?可以看作為匿名函數的簡寫方式。

var addition = function(a, b) { return a + b };
// 等同
var addition = (a, b) => { return a + b };

 

2. 語法

arrow functions(箭頭函數)主要有以下4種語法:

// 1)基本
(param1, param2, paramN) => { expression }
(param1, param2, paramN) => { return expression }

// 2)只有一個參數時,括號是可選的
(singleParam) => { expression }
singleParam => { expression }

// 3)不帶參數時,在參數區域帶有括號
() => { expression }

// 4)函數主體若不帶{}大括號,表示直接返回函數主體
(param1, param2, paramN) => { return expression }
(param1, param2, paramN) => expression // 等同於上面

 

3. 特性

3.1 沒有自身this

arrow function沒有自身的this,即在arrow function內部使用this時,此this指向創建此函數時的外部this。

場景:在Web開發時都會用到ajax的回調,回調函數內的this常常用外部創建的self、that、_this等變量暫存,而當回調函數采用arrow function方式時就可以直接使用外部的this。

示例

var ajax = function(url, successCallback) {
    // TODO ajax
    successCallback && successCallback();
};

var productBLL = {
    productName: '瓜子',
    query: function() {
        // arrow function
        ajax('query', () => {
            console.log(this); // => productBLL
            console.log(this.productName); // => 瓜子(productBLL.productName)
        });
    }
};

productBLL.query();

 

3.2  call()、apply() 調用無法改變this

就像上面講的arrow function沒有自身的this,當用call()或apply() 調用箭頭函數時無法改變函數主體內的this。

示例

// 普通函數
var sayHello = function(userName) {
    console.log('hi ' + userName);
    console.log(this);
};
sayHello.call({ x: 1 }, 'polk'); // => this == { x: 1 }

// 箭頭函數
var sayHello2 = (userName) => {
    console.log('hi ' + userName);
    console.log(this);
};
sayHello2.call({ y: 2 }, 'polk'); // => this == window

 

3.3 沒有arguments

使用arrow function創建的函數,自身是沒有arguments成員。

var sayHello = (userName) => {
    console.log('hi ' + userName);
    console.log(arguments); // => Uncaught ReferenceError: arguments is not defined
};

 

3.4 arrow function作為某個對象的方法成員時,this指向非此對象

當某個對象的方法為arrow function時,那么此方法內的this指向並非是此對象。

示例:

var productBLL = {
    productName: '瓜子',
    sayName: function() {
        console.log(this.productName);
    },
    sayName2: () => {
        console.log(this.productName);
    }
};

productBLL.sayName(); // => 瓜子
productBLL.sayName2(); // => undefined, this == window

  

4.擴展閱讀

arrow function MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM