美文网首页
箭头函数和普通函数中this的区别

箭头函数和普通函数中this的区别

作者: 楠楠_c811 | 来源:发表于2018-08-05 18:27 被阅读422次

最近遇到一个面试题,被问到箭头函数和普通函数中的this区别,总结了一下拿出来跟大家分享一下。
首先知道一下什么是箭头函数,箭头函数就是没有function关键字,而是一个类似箭头的函数:

var a = ()=>{
  return 1;
}

相当于

function a(){
  return 1;
}

那么就来看一下他们的区别

普通函数中的this:

1. this总是代表它的直接调用者, 例如 obj.function ,那么function中的this就是obj;

2.在默认情况(非严格模式下,未使用 'use strict'),没找到直接调用者,则this指的是 window;

3.在严格模式下,没有直接调用者的函数中的this是 undefined;

4.使用call,apply,bind(ES5新增)绑定的,this指的是 绑定的对象。

箭头函数中的this:

1.箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值,自己本身并没有this值;
2.箭头函数的this永远指向其上下文的this,任何方法都改变不了其指向,如call(), bind(), apply()。

1.箭头函数作为匿名函数,是不能作为构造函数的,不能使用new

var B = ()=>{
  value:1;
}
var b = new B(); 
//报错提示:Uncaught TypeError: B is not a constructor

2.箭头函数不绑定arguments,取而代之用rest参数…解决

function A(a){
  console.log(arguments); //[object Arguments] {0: 1}
}

var B = (b)=>{
  console.log(arguments); //ReferenceError: arguments is not defined
}

var C = (...c)=>{ //...c即为rest参数
  console.log(c); //[3]
}
A(1);
B(2);
C(3);

3.箭头函数会捕获其所在上下文的 this 值,作为自己的 this 值

var obj = {
  a: 10,
  b: function(){
    console.log(this.a); //10
  },
  c: function() {
     return ()=>{
           console.log(this.a); //10
     }
  }
}
obj.b(); 
obj.c()();

箭头函数当方法使用的时候没有定义this绑定。
这句话是MDN里面写的,但是我觉得这条和上条其实是一条,还是捕获所在的上下文,比如下面这个例子:b是一个箭头函数,然后它的 this是指向window,这是为什么呢,因为箭头函数捕获的是obj{}这个对象的环境,然后这个环境的this指向的是window,就相当于上一条的例子:在c方法里面return的那个箭头函数捕获的是c:function(){}这个环境的this,而这个环境的this是obj,这样是不是就清晰明了了

var obj = {
  a: 10,
  b: () => {
    console.log(this.a); //undefined
    console.log(this); //window
  },
  c: function() {
    console.log(this.a); //10
    console.log(this); //obj{...}
  }
}
obj.b(); 
obj.c();

使用call()和apply()调用
通过 call() 或 apply() 方法调用一个函数时,只是传入了参数而已,对 this并没有什么影响

var obj = {
  a: 10,
  b: function(n){
    var f = (v) => v + this.a;
    return f(n);
  },
  c: function(n) {
    var f = (v) => v + this.a;
    var m = {a:20};
    return f.call(m,n);
  }
}

console.log(obj.b(1)); //11
console.log(obj.c(1)); //11

箭头函数没有原型属性

var a = ()=>{
  return 1;
}

function b(){
  return 2;
}

console.log(a.prototype);//undefined
console.log(b.prototype);//object{...}

箭头函数不能当做Generator函数,不能使用yield关键字
箭头函数不能换行

var a = ()
          =>1; //SyntaxError: Unexpected token =>

大概总结了这些,先这样吧,往后接触的更多一些,了解的就会更深入一些,到时候再继续分享吧。

相关文章

  • 箭头函数和普通函数的主要区别是什么?

    箭头函数和普通函数的主要区别: this的指向问题,箭头函数是不存在this的(也是箭头函数和普通函数最主要的区别...

  • 函数的扩展

    函数的扩展 箭头函数和普通函数区别箭头函数没有this对象,箭头函数的里的this始终指向定义时所在对象,普通函数...

  • 常见前端面试题

    箭头函数与普通函数的区别 箭头函数语法比普通函数更加简洁,但箭头函数中没有arguments,所以形参可以使用展开...

  • 箭头函数与普通函数的区别

    箭头函数与普通函数的区别,实质是我们是否理解了箭头函数,在我刚开始接触ES6时,印象中的箭头函数与普通函数的区别就...

  • 2019-01-11

    ES6 箭头函数 箭头函数表示法:()=>console.log('Hello') 箭头函数和普通函数的区别 和普...

  • js理解普通函数和箭头函数

    普通函数: 箭头函数: 区别: 构造函数和原型 箭头函数不能作为构造函数 不能new。会报错 箭头函数没有原型属性...

  • 箭头函数和立即执行函数

    箭头函数 箭头函数和普通函数有什么区别?如果把箭头函数转换为不用箭头函数的形式,如何转换主要是this的差别,箭头...

  • 简单说 JavaScript的箭头函数

    说明箭头函数本质还是函数,我们来看看他与JavaScript中普通函数的区别,先看看写法上的区别。 写箭头函数,我...

  • 箭头函数和普通函数有什么区别?

    题目:箭头函数和普通函数有什么区别?箭头函数为什么不能用作构造函数? 参考答案 区别: 箭头函数在一些情况下书写更...

  • 改变this指向的方法

    箭头函数和普通函数的区别如下。 普通函数:根据调用我的人(谁调用我,我的this就指向谁) 箭头函数:根据所在的环...

网友评论

      本文标题:箭头函数和普通函数中this的区别

      本文链接:https://www.haomeiwen.com/subject/zeabvftx.html