博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
五、箭头函数
阅读量:5974 次
发布时间:2019-06-20

本文共 2074 字,大约阅读时间需要 6 分钟。

语法

javascript有基本的类函数,可以当做参数传递,最熟悉的setTimeout

setTimeout(function() {	console.log("setTimeout called!");}, 1000);复制代码

上面这种函数是没有名字的,我们称之为匿名函数

es6中规定了不同的语法去定义匿名函数,这个叫做匿名函数,所以我们可以重新把以上代码写成

setTimeout(() => {    console.log("setTimeout called!")}, 1000);复制代码

如果函数只有一个表达式,,就可以缩写成以下

setTimeout(() => console.log("setTimeout called!"), 1000);复制代码

参数

如果想要传递参数要怎么做呢?

以下这个代码要写成箭头函数

let add = function(a,b) {	return a + b;};复制代码

可以写为

let add = (a,b) => a + b;复制代码

==在第一个例子中我们写了return a+b,但是在箭头函数中只写了a+b,那事因为在箭头函数中,如果只有一行,语句会自动返回,而不需要使用return关键字。==

this的指向

让我们假设我们有一个对象有一个叫做sayLater的函数

let obj = {	name: "asim",	sayLater: function() {		console.log(`${this.name}`);	}};obj.sayLater();复制代码

在sayLater函数中,这个this的指向是obj

所以console.log的值为asim
现在让我们来试一下用setTimeout函数输出的值是多少

let obj = {    name: "asim",    sayLater: function () {        setTimeout(function () {            console.log(`${this.name}`);        }, 1000);    }};obj.sayLater();复制代码

但是上面输出的值确实undefined

调用上下文

这个结果取决于这个函数的调用方式

在最基本的调用上obj.sayLater(),这个值是调用上下文,值为obj

拿在setTimeout的匿名函数中呢?this会指向什么呢?

setTimeout(function () {    console.log(`${this.name}`);}, 1000);复制代码

他的答案就看情况了,在浏览器中,值是undefined或者是global对象,这个取决于是使用'use strict'或者非严格模式下,在node中他是一个超时对象

所以在setTimeout的例子中,this的值不会是obj,所以最后this.name返回的要么就是undefined或者是报错了。

这样不稳定的语法是个头疼的问题,也是javascript一直存在的问题,在es5中有很多方法解决这个问题,但是一般比较常用的方法就是,在调用上面声明个变量,一般叫做self或者vm,然后把这个用在函数中

let obj = {    name: "asim",    sayLater: function () {        let self = this; // Assign to self        console.log(self);        setTimeout(function () {            console.log(`${self.name}`); // Use self not this        }, 1000);    }};复制代码

但是在es6中,我们有更好的方式解决这个问题,如果我们使用箭头函数,那箭头函数里面的this的值和外面的值是一样的

let obj = {    name: "asim",    sayLater: function () {        console.log(this); // `this` points to obj        setTimeout(() => {            console.log(this); // `this` points to obj            console.log(`${this.name}`); // `this` points to obj        }, 1000);    }};obj.sayLater();复制代码

可以尝试着跑以上的代码,就发现this输出来的都是obj

总结

新的箭头函数的语法,不止是语法上的简便,还解决了this的指向问题

转载于:https://juejin.im/post/5b40dfa86fb9a04fcb5b43fc

你可能感兴趣的文章
阿里巴巴Druid数据源,史上最强的数据源,没有之一
查看>>
【python】一个简单的贪婪爬虫
查看>>
拒绝了对对象 'XXX' (数据库 'XXX',架构 'dbo')的 SELECT 权限
查看>>
ext3文件系统反删除利器-ext3grep
查看>>
【python】Python遍历dict的key最高效的方法是什么?
查看>>
正则表达式匹配
查看>>
HTML5 ArrayBufferView之DataView
查看>>
Android SurfaceView的生命周期
查看>>
ArcGIS Engine开发前基础知识(2)
查看>>
WKWebView不显示提示框(Swift)
查看>>
实战CentOS系统部署Hadoop集群服务
查看>>
Spark RDD概念学习系列之rdd持久化、广播、累加器(十八)
查看>>
Mac终端(Terminal)自定义颜色,字体,背景
查看>>
visio任意角度精确旋转图形
查看>>
如何制作一款HTML5 RPG游戏引擎——第四篇,情景对话
查看>>
Leetcode: Perfect Rectangle
查看>>
【github&&git】1、github中的watch、star、fork的作用
查看>>
getLastSql()用法
查看>>
使用java做paypal开发时购买东西支付不成功的原因
查看>>
Java8 Lamdba表达式 002
查看>>