如何回答面试官普通函数和箭头函数的区别(this指向)

普通函数和箭头函数区别有以下几点区别:

  1. 声明方式不同:普通函数可以是声明式的,也可以是赋值式;而箭头函数只能是赋值式的;
  2. this指向不同:普通函数有原型prototype,this指向不确定;箭头函数本身没有this,因为没有原型,this指向确定,指向他父级作用域;
  3. new不同:普通函数可以new;箭头函数不能new,没有prototype属性,也不可以被当作构造函数,
  4. 传参方式:普通函数可以获取 arguments对象,箭头函数不能获取可以通过 ...rest ,用 rest 对象代替

箭头函数写法:

let sum = (a, b) => {return a + b;
}

普通函数写法

var sum = function (a, b){return a + b;
}

1.this指向问题

这一点要特别注意,也是面试的时候面试官最关注的。

  • 箭头函数的this指向的是父级作用域的this,是通过查找作用域链来确定 this 的值,也就是说看的是上下文的this,指向的是定义它的对象,而不是使用时所在的对象。
  • 普通函数指向的是它的直接调用者。

(1)普通函数的 this 指向可以参考 阮一峰js的this用法 ,当听到你说 this 的问题,面试官可能会接下去问你 this 的一些拓展问题了,如何改变 this 指向,比如bind方法什么的,然后还可能让你实现 bind,总之真的很多可以问的。

(2)箭头函数的this

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

题中的箭头函数 b,没有this,它的this是继承来的,默认指向定义它的时候的对象,就是我们说的宿主对象,而不是执行它的对象。这里通过obj.b(),此时this指向的window对象,上面没有a,所以返回undefined。

而普通函数 c 中,通过obj.c(),this指向的是它的直接调用者,就是obj,所以返回1。

拓展

(1)setTimeout中的普通函数:

var obj = {a:1, print(){setTimeout(function(){console.log(this.a);},1000);}};
obj.print();//undefined

定时器中的函数由于没有默认宿主对象,setTimeout中的function未被任何对象调用,它的 this 指向默认是 window对象 ,自然输出 undefined

setTimeout中的箭头函数:

  var obj = {a:1,print(){setTimeout(() => { console.log(this.a); },1000);}};obj.print();// 1

箭头函数的 this 指的是定义它的对象,所以 this 指向的是 obj对象 ,所以 obj.a 确实应该输出1。

注意⚠️,我们前文一直都强调箭头函数没有 this,所以呢,我们不可以用 call()apply()bind() , 这些方法去改变this的指向。

2.不可以被当作构造函数

不能被当作构造函数来使用,通过new命令来作为构造函数会报错,这里没有构建原型的说法,不存在prototype这个属性,也不能通过super访问原型的属性,而且new target也是不能用的。

3.不可以使用arguments对象,该对象在函数体内不存在,如果要用就用rest参数替代。

普通函数:

function f1(arr) {console.log(arguments);
}
f1([1,2,3]); // [1,2,3]

箭头函数:

let f2 = (arr) => {console.log(arguments);
}
f2([1,3,9]); //Uncaught ReferenceError: arguments is not defined
let f3 = (...arr) => {console.log(arr);
}
f3([1,4,5]); // [1,4,5]

普通函数和箭头函数区别总结:

普通函数和箭头函数区别有以下几点区别:

  1. 声明方式不同:普通函数可以是声明式的,也可以是赋值式;而箭头函数只能是赋值式的;
  2. this指向不同:普通函数有原型prototype,this指向不确定;箭头函数本身没有this,因为没有原型,this指向确定,指向他父级作用域;
  3. new不同:普通函数可以new;箭头函数不能new,没有prototype属性,也不可以被当作构造函数,
  4. 传参方式:普通函数可以获取 arguments对象,箭头函数不能获取可以通过 …rest ,用 rest 对象代替

普通函数和箭头函数区别相关推荐

  1. # 普通函数和箭头函数的区别

    普通函数和箭头函数 写在前面 函数(Function)是 JavaScript 里的'一等公民'.是由称为函数体的一系列语句组成.可以当做入参,出参(返回值)使用.和对象一样,有自己的属性和方法.区别 ...

  2. 箭头 运算符_论普通函数和箭头函数的区别以及箭头函数的注意事项和不适用场景...

    论普通函数和箭头函数的区别以及箭头函数的注意事项和不适用场景 箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱.就是这种我们日常开发中一直在使用的API,大 ...

  3. es6箭头函数_【知识点】ES6箭头函数、箭头函数与普通函数的区别

    作者:長安曹公子 文章出处:ES6 - 箭头函数.箭头函数与普通函数的区别 一.基本语法 ES6中允许使用箭头=>来定义箭头函数,具体语法,我们来看一个简单的例子: // 箭头函数 let fu ...

  4. js匿名函数、箭头函数,区别

    js匿名函数.箭头函数,以及他们的区别 匿名函数 箭头函数 区别 1.匿名函数 简单点说就是没有名字的函数,在声明函数时不写函数名称,(将函数赋值给变量)叫匿名函数. 匿名函数可以有效的保证在页面上写 ...

  5. js map 箭头_JS异常函数之箭头函数

    来源:logrocket作者:Maciej Cieślar 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 在JS中,箭头函数可以像普通函数一样以多种方式使用.但是,它们一般用于需要匿名函数 ...

  6. js map 箭头_JS异常函数之-箭头函数

    来源:logrocket 作者:Maciej Cieślar 译者:前端小智 为了保证的可读性,本文采用意译而非直译. 在JS中,箭头函数可以像普通函数一样以多种方式使用.但是,它们一般用于需要匿名函 ...

  7. java 箭头函数_箭头函数丶Java教程网-IT开发者们的技术天堂

    基本用法 在ES6中允许使用 => 来定义函数,如下: var f = a => a; console.log(f(1)); //1 就等同于 var f = function(a){ r ...

  8. JavaScript函数之箭头函数

    箭头函数表达式 箭头函数包括一个参数列表(零个或多个参数,如果参数个数不是一个的话要用 ( - )包围起来),然后是标识 =>,函数体放在最后. 示例讲解 例一: // 传统的定义方式var s ...

  9. python sort函数返回值_lambda函数与箭头函数在集合内置函数应用中的对照学习

    Python语言中有一个定义轻量级规则的lambda函数,其语法格式为: Lambda 参数列表:返回值表达式 简单的例子如:定义func=lambda x,y:x+y,则调用func(10,20)的 ...

最新文章

  1. 1.2.1 分层结构 协议 接口 服务
  2. 【Linux】27_网站服务静态站点
  3. hbuilderx制作简单网页_网页制作的基本步骤是怎样的?制作简单网页的具体操作有哪些呢?...
  4. 软件工程--第十三周学习进度
  5. Windows单机配置Zookeeper环境
  6. 【Android】eclipse 时常报错java.lang.object cannot be resolved-解决
  7. 磁盘及网络测试工具(iperf hdparm dd)
  8. 新手学习算法----二叉树(将一个二叉查找树按照中序遍历转换成双向链表)
  9. linux系统编程:自己动手写一个ls命令
  10. python语言是非跨平台语言_python特点
  11. 在Flex4中嵌入字体
  12. 存储介质(sd卡,硬盘等)读写速度测试
  13. 6LowPAN与CoAP协议
  14. 打开计算机不显示磁盘盘符,移动硬盘盘符不显示如何修复
  15. SCC(五):ACT
  16. 《城市化》(顾朝林)-1
  17. 深度学习之参数计算(CNN为例)
  18. html模态框插件,如何使用JavaScript构建模态框插件
  19. 联想笔记本电脑键盘按键映射替换
  20. R语言参数检验多重比较

热门文章

  1. 网络推广有哪些推广方式?网络推广怎么做到多渠道进行推广?
  2. Android Multidex(dex分包)
  3. Unity第三人称上帝视角控制
  4. 《有限与无限的游戏》第三章 我是自己的天才:经典摘抄(2)
  5. Mybatis 开启驼峰命名映射
  6. L1-070 吃火锅 (15 分)
  7. 市场管理流程介绍(MM流程)
  8. 对抗神经网络(二)——DCGAN
  9. 吴恩达深度学习 | (18) 卷积神经网络专项课程第二周学习笔记
  10. 插画喵课程 玫瑰花怎么画教程(详细步骤)