Javascript 是';箭头函数';和';功能';等效/可互换?

Javascript 是';箭头函数';和';功能';等效/可互换?,javascript,ecmascript-6,arrow-functions,Javascript,Ecmascript 6,Arrow Functions,ES2015中的箭头函数提供了更简洁的语法 我现在可以用箭头函数替换所有函数声明/表达式吗 我要注意什么 示例: 构造函数 function User(name) { this.name = name; } // vs const User = name => { this.name = name; }; 原型方法 User.prototype.getName = function() { return this.name; }; // vs User.proto

ES2015中的箭头函数提供了更简洁的语法

  • 我现在可以用箭头函数替换所有函数声明/表达式吗
  • 我要注意什么
示例:

构造函数

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

// vs

const User = name => {
  this.name = name;
};
原型方法

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

// vs

User.prototype.getName = () => this.name;
对象(文字)方法

回调

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

// vs

setTimeout(() => {
  // ...
}, 500);
可变函数

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

// vs
const sum = (...args) => {
  // ...
};

tl;博士:箭头函数和函数声明/表达式不是等价的,不能盲目替换。
如果要替换的函数未使用
this
参数
,并且未使用
new
调用,则选择“是”


通常情况下:视情况而定。箭头函数的行为与函数声明/表达式不同,因此让我们先看看它们的区别:

1。词法
参数

箭头函数没有自己的
参数
绑定。相反,这些标识符像其他变量一样在词法范围内解析。这意味着在箭头函数内部,
this
arguments
指的是箭头函数在环境中定义的
this
arguments
的值(即箭头函数的“外部”):

//使用函数表达式的示例
函数createObject(){
log('createObject`:'内,this.foo);
返回{
傅:42,,
bar:function(){
log('Inside'bar`:',this.foo);
},
};
}

createObject.call({foo:21}).bar();//在createObject中重写`this`
tl;博士:箭头函数和函数声明/表达式不是等价的,不能盲目替换。
如果要替换的函数未使用
this
参数
,并且未使用
new
调用,则选择“是”


通常情况下:视情况而定。箭头函数的行为与函数声明/表达式不同,因此让我们先看看它们的区别:

1。词法
参数

箭头函数没有自己的
参数
绑定。相反,这些标识符像其他变量一样在词法范围内解析。这意味着在箭头函数内部,
this
arguments
指的是箭头函数在环境中定义的
this
arguments
的值(即箭头函数的“外部”):

//使用函数表达式的示例
函数createObject(){
log('createObject`:'内,this.foo);
返回{
傅:42,,
bar:function(){
log('Inside'bar`:',this.foo);
},
};
}
createObject.call({foo:21}).bar();//在createObject中重写`this`
Arrow functions=>迄今为止最好的ES6功能。他们是一个巨大的挑战 ES6的强大补充,我经常使用

等等,您不能在代码中的任何地方都使用箭头函数,它不会在所有情况下都起作用,例如
这个
中箭头函数不可用。毫无疑问,arrow函数是一个很好的补充,它带来了代码的简单性

但是当需要动态上下文时,不能使用arrow函数:定义方法、使用构造函数创建对象、在处理事件时从中获取目标

不应使用箭头函数,因为:
  • 他们没有

    它使用“词法范围”来计算“
    this
    ”的值 应该是。在简单的单词词法范围中,它使用 在函数的主体内部

  • 它们没有
    参数

    箭头函数没有
    参数
    对象。但同样 可以使用rest参数实现功能

    let sum=(…args)=>args.reduce((x,y)=>x+y,0)
    sum(3,3,1)//输出-7
    `

  • 它们不能与新代码一起使用

    箭头函数不能是构造函数,因为它们没有prototype属性

  • 何时使用箭头功能,何时不使用:
  • 不要将函数作为属性添加到对象文字中,因为 无法访问此文件
  • 函数表达式最适合对象方法。箭头函数 最适合于回调或方法,如
    map
    reduce
    forEach
  • 对按名称调用的函数使用函数声明(因为 它们被吊起来了)
  • 对回调使用箭头函数(因为它们往往更简洁)
  • Arrow functions=>迄今为止最好的ES6功能。他们是一个巨大的挑战 ES6的强大补充,我经常使用

    等等,您不能在代码中的任何地方都使用箭头函数,它不会在所有情况下都起作用,例如
    这个
    中箭头函数不可用。毫无疑问,arrow函数是一个很好的补充,它带来了代码的简单性

    但是当需要动态上下文时,不能使用arrow函数:定义方法、使用构造函数创建对象、在处理事件时从中获取目标

    不应使用箭头函数,因为:
  • 他们没有

    它使用“词法范围”来计算“
    this
    ”的值 应该是。在简单的单词词法范围中,它使用 在函数的主体内部

  • 它们没有
    参数

    箭头函数没有
    参数
    对象。但同样 可以使用rest实现功能
    function sum() {
      let args = [].slice.call(arguments);
      // ...
    }
    
    // vs
    const sum = (...args) => {
      // ...
    };
    
      // Using
      // @func = function() {use this here} or This => {use This here}
      using(func) {
        return func.call(this, this);
      }
    
      var obj = {f:3, a:2}
      .using(This => This.f + This.a) // 5
    
    var obj = {f:3, a:2}
    (This => This.f + This.a).call(undefined, obj); // 5