随笔 - 93  文章 - 0 评论 - 303 trackbacks - 0

 

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

 

posted on 2018-01-26 10:26 方木一 阅读(...) 评论(...) 编辑 收藏
TOP