箭头函数vs函数声明/表达式:它们是否等效/可交换? [英] Arrow function vs function declaration / expressions: Are they equivalent / exchangeable?

查看:171
本文介绍了箭头函数vs函数声明/表达式:它们是否等效/可交换?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


规范性问题如果在使用箭头函数替换函数声明/表达式后发现有关问题的问题,请将其关闭。 >

ES2015中的箭头功能提供了更简洁的语法。现在可以用箭头函数替换所有的函数声明/表达式吗?我需要注意什么?



示例:



构造函数

  function User(name){
this.name = name;
}

// vs

const User = name => {
this.name = name;
};

原型方法

 code> User.prototype.getName = function(){
return this.name;
};

// vs

User.prototype.getName =()=> this.name;

对象(文字)方法

  const obj = {
getName:function(){
// ...
}
};

// vs

const obj = {
getName:()=> {
// ...
}
};

回调

  setTimeout(function(){
// ...
},500);

// vs

setTimeout(()=> {
// ...
},500);

变体函数

 code> function sum(){
let args = [] .slice(arguments);
// ...
}

// vs
const sum =()=> {
let args = [] .slice(arguments);
// ...
};


解决方案

tl; dr: 不!箭头函数和函数声明/表达式不等效,不能盲目替换。

如果要替换的函数不使用这个参数并没有使用新的调用,那么是






经常:它取决于。箭头函数具有与函数声明/表达式不同的行为,因此可以先看看差异:



1。词汇这个参数



箭头函数没有自己的这个参数绑定。相反,这些标识符就像任何其他变量一样在词法范围内得到解决。这意味着在一个箭头函数内,这个参数指的是 / code>和参数在环境中,箭头函数定义 (即外部箭头函数):



  //使用函数expressionfunction的示例createObject(){console.log('Inside` createObject`:',this.foo); return {foo:42,bar:function(){console.log('Inside` bar`:',this.foo); },};} createObject.call({foo:21})。bar(); //在createObject内部覆盖`this`  



  //使用箭头函数function exampleObject(){console.log('Inside` createObject`:',this.foo)的示例; return {foo:42,bar:()=> console.log('Inside'bar`:',this.foo),};} createObject.call({foo:21})。bar(); //在createObject中覆盖`this`  



在函数表达式中,这个是指在 createObject 内创建的对象。在箭头功能的情况下,这个 createObject



如果您需要访问当前环境的这个,这将使箭头功能很有用: p>

  //当前常用模式
var that = this;
getData(function(data){
that.data = data;
});

//箭头函数更好的替代方法
getData(data => {
this.data = data;
});

注意这也意味着不是可以设置一个箭头函数的这个 .bind .call



如果您对这个不太熟悉,请考虑阅读





2。箭头函数不能用新调用



ES2015区分了调用能力和构造能力的功能。如果函数是可构建的,则可以使用 new (即 new User()调用该函数。如果一个函数是可调用的,它可以被调用,而没有 new (即正常的函数调用)。



函数声明/表达式既可构造又可调用。

箭头函数(和方法)只能调用。
class 构造函数只能构造。



如果您尝试调用不可调用的函数或要构造一个不可构造的函数,你会得到一个运行时错误。






知道这一点,我们可以说明如下。



可替换:




  • 不使用 参数

  • .bind这个)



可替换:



查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆