labmda表达式和普通函数

9次阅读

共计 732 个字符,预计需要花费 2 分钟才能阅读完成。

在使用 ng-zorro 的上传文件组件时,因为要自定义上传方式,找到他的一个属性,需要穿对应的方法进去让他执行,于是就写了一个上传方法:
/**
* 导入学生信息
*/
importItems(item: UploadXHRArgs) {
const formData = new FormData();
formData.append(‘multipartFile’, item.file as any);
return this.studentService.batchImport(formData).subscribe(() => {
this.reloadData();
this.message.create(‘success’, ‘ 上传成功!’);
}, () => {
this.message.create(‘error’, ‘ 上传失败!’);
});
}
结果一上传,居然报了个 batchImport’ of undefined 的错. 我把 this 对象打出来后,发现 this 对象是这样的: 而我们组件对象应该是这样的:
打出来后明白了,应该是将函数传递过去后执行环境变了,this 对象也就不同了,但是这要怎么解决呢?回文档仔细查看,发现了忽略的字:

他是要求用 labmda 表达式的, 改成 labmda 表达式后, 果然成功了。上网一搜,发现了 labmda 表达式与普通函数的不同:
箭头函数和普通函数有一个微妙的区别,那就是箭头函数没有它们自己的 this,箭头函数中的 this 值始终来自闭包所在的作用域。如果你在箭头函数引用了 this、arguments 或者参数之外的变量,那它们一定不是箭头函数本身包含的,而是从父级作用域继承的原来如此,箭头函数本身就为一个闭包操作,我们使用箭头函数之后就不用写闭包, 也能保留我们想要的作用域了。

正文完
 0