当前位置: 首页 > news >正文

js(=>) 箭头函数

ES6标准新增了一种新的函数:Arrow Function(箭头函数)。

为什么叫Arrow Function?因为它的定义用的就是一个箭头

x => x * x

上面的箭头函数相当于:

function (x) {
    return x * x;
}

箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连{ ... }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 })

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(); // 25

如果使用箭头函数,以前的那种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(2015); // 25

相关文章:

  • JavaScript中的回调函数(callback)
  • com教程(使用VS2015编写ATL示例)
  • 控制台console使用MFC库函数,Cout输出CString的方法
  • PDFsharp使用介绍
  • 详解开源免费且稳定实用的.NET PDF打印组件itextSharp
  • 机器人是什么
  • C++中L和_T()之区别
  • 关于 wcout 输出中文的问题
  • 非静态成员必须与特定对象相对
  • 压缩文件修复
  • 循环冗余校验(CRC)算法入门引导
  • C++ getline函数用法详解
  • cout后面输出时加endl和不加endl的区别
  • iostream
  • ChromeNativeMessaging 原生消息通信
  • canvas 五子棋游戏
  • es6(二):字符串的扩展
  • ES6--对象的扩展
  • GitUp, 你不可错过的秀外慧中的git工具
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript DOM 10 - 滚动
  • Java程序员幽默爆笑锦集
  • python学习笔记-类对象的信息
  • vagrant 添加本地 box 安装 laravel homestead
  • 程序员最讨厌的9句话,你可有补充?
  • 排序算法学习笔记
  • 前端设计模式
  • 如何选择开源的机器学习框架?
  • 什么是Javascript函数节流?
  • 提醒我喝水chrome插件开发指南
  • 微服务入门【系列视频课程】
  • 在Unity中实现一个简单的消息管理器
  • No resource identifier found for attribute,RxJava之zip操作符
  • #### go map 底层结构 ####
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $L^p$ 调和函数恒为零
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (JS基础)String 类型
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 微服务 服务保护 自动重试 Polly
  • .NET处理HTTP请求
  • .NET上SQLite的连接
  • :not(:first-child)和:not(:last-child)的用法
  • @31省区市高考时间表来了,祝考试成功
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C#C++]类CLASS
  • [Codeforces1137D]Cooperative Game