【二十】箭头函数

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。
为什么叫Arrow Function? 因为它的定义用的就是一个箭头:

x => x*x

上面的箭头函数相当于:

function (x) {
    return x * x;
}

测试浏览器是否支持ES6的Arrow Function:

'use strict';
var fn = x => x * x;
alert('你的浏览器支持ES6的Arrow Function!');

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含了一个表达式,连{ ... }和return都省略掉了。还有一种可以包含多条语句,这时候就不能省略{ ... }和return:

x => {
    if (x > 0) {
        return x*x;
    }
    else {
        return -x*x;
    }
}

如果参数不是一个,就需要用括号()括起来:

//  两个参数;
(x, y) => x * x + y * y

// 无参数;
() => 3.14

// 可变参数;
(x, y, ...rest) => {
    var i, sum = x + y;
    for (i=0; i<rest.length; i++) {
        sum += rest[i];
    }
    return sum;
}

如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:

//SyntaxError:
x => { foo: x }

因为和函数体的{ ... } 有语法冲突,所以要改为:

//  ok;
x => ({ foo: x})

</br>

this
箭头函数看上去是匿名函数的一种简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,由上下文确定。
回去前面的例子,由于JavaScript函数对this绑定的错误处理,下面的例子无法得到预期结果:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth; // 1990
        var fn = function () {
            return new Date().getFullYear() - this.birth;  // this指向window或undefined
        };
        return fn();
    }
}

现在,箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者obj:

var obj = {
    birth: 1990,
    getAge: function () {
        var b = this.birth;  // 1990
        var fn = () => new Date().getFullYear()  - this.birth;  // this指向obj对象
        return fn();
    }
};
obj.getAge();  // 27

如果使用箭头函数,以前的那种hack写法:

var that = this;

就不再需要了。
由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略:

var obj = {
    birth: 1990,
    getAge: function (year) {
        var b = this.birth;  // 1990
        var fn = (y) => y - this.birth;  // this.birth仍是1990
        return fn.call({birth:2000}, year);
    }
};
obj.getAge(2017);  // 27
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数 1.JavaScript允许传入任意个参数而不影响调用,因此传入的参数比定义的参数多也没有问题,虽然函数内部...
    wyude阅读 212评论 0 1
  • 函数就是最基本的一种代码抽象的方式。 定义函数function abs(x) {if (x >=0){return...
    _我和你一样阅读 507评论 0 0
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 8,104评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,310评论 1 10
  • 我以为很多东西 早已遗忘 原来从不曾忘记 触景变会生情 犹记得上学路上 家门口 一直凝望的您 也不曾忘记 殷殷等待...
    逐风逐你阅读 246评论 0 0

友情链接更多精彩内容