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