Skip to content

函数

带名,匿名,箭头函数重要区别

  1. 普通带名函数
js
function abs(x) {
  if (x >= 0) {
    return x;
  } else {
    return -x;
  }
}
  1. 匿名函数
js
let abs = function (x) {
  if (x >= 0) {
    return x;
  } else {
    return -x;
  }
};
  1. 箭头函数
js
(x) => x * x;

相当于

js
function (x) {
    return x * x;
}

当箭头函数不仅包含一个表达式时:

js
(x, y) => {
  if (x > 0) {
    return x + y;
  } else {
    return -x + y;
  }
};

举例

js
var obj1 = {
  birth: 1990,
  getAge: function (year) {
    let fn = function (y) {
      return y - this.birth; // this指向window或undefined
    };
    return fn(year);
  },
};

var obj2 = {
  birth: 1990,
  getAge: function (year) {
    var fn = (y) => y - this.birth; // this.birth为1990
    return fn(year);
  },
};

调用函数 obj1.getAge(2017)和调用 obj2.getAge(2017)会得到相同的结果吗?

obj1 中 fn 函数,由于 JavaScript 中函数对 this 绑定的错误处理,得不到预期的结果,this.birth 指向 window 或 undefined。

但是 obj2,fn 函数是箭头函数,箭头函数完全修复了 this 的指向,this 总是指向词法作用域,也就是外层调用者 obj2。

区别:

  • 箭头函数不能作为构造函数。
  • 箭头函数没有 prototype(原型),所以箭头函数本身没有 this。
  • 箭头函数内部的 this 是词法作用域,由上下文确定,this 指向在定义的时候继承自外层第一个普通函数的 this。函数体内的 this 对象,就是定义时所在的对象,与使用时所在的对象无关。