第 58 题:箭头函数与普通函数(function)的区别是什么?构造函数(function)可以使用 new 生成实例,那么箭头函数可以吗?为什么?
箭头函数允许我们用更短的语法定义函数。箭头函数可用于替代传统函数 function() {}。箭头函数可用于替代任何函数用例。例如,在 React 中,您可以使用箭头函数来定义功能组件而不是常规函数。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
箭头函数与普通函数(function)的区别是什么?构造函数(function)可以使用 new 生成实例,那么箭头函数可以吗?为什么
你好,我想请问一下,后面判断result的用意是什么呢?
1)、箭头函数不同于一般函数:
(1)一般函数可以先调用后定义,箭头函数只能先定义后调用
(2)一般函数有arguments,而箭头函数没有arguments,但可以使用rest参数(剩余参数)
(3)一般函数可以当作构造函数,而箭头函数不能当作构造函数,因为箭头函数没有自己的this
#### 2)、箭头函数的简写形式:
(1)、当只有一个形参时可以省略圆括号;
(2)、当函数体只一条语句并且该语句会作为返回值返回时,可以省略花括号及return关键词
箭头函数中this指向依赖于外层函数中的this指向,也就是说箭头函数中的this指向定义时所在的对象,而不绑定当前调用者
箭头函数具有以下特性:
为什么不能当Generator 函数使用
箭头函数不能被 new 执行,不能用作构造函数。因为箭头函数没有prototype ,也没有自己的this,不能调用call和apply
箭头函数的this是上下文的this,它会从自己作用域的上一层继承this
箭头函数自身没有arguments(但是可以向作用域链中查找arguments), 不能使用yield命令,不能做generator函数
箭头函数不可以使用new,因为箭头函数没有prototype(使用new需要把函数的prototype赋值给新对象的__proto__),没有自己的this,不能调用call和apply
let num1 = [1,2,2,1];
let num2 = [2,2];
let res = [];
let obj = {};
function fn(n1,n2) {
for(let i = 0;i<n1.length;i++){
if(!obj[n1[i]]){
obj[n1[i]] = 1;
}else{
obj[n1[i]]++
}
}
for(let i = 0;i<n2.length;i++){
if(obj[n2[i]]){
res.push(n2[i]);
obj[n2[i]]--;
}
}
return res
}
console.log(fn(num1,num2))
箭头函数由于this的指向在它定义的时候已经确定了(它外层代码的this),并不像其他普通函数在执行的时候确定this的指向,所以在new 的时候不会改变this的指向(在new 的过程中this会变成空对象然后指向对应的地方)
剪头函数没有自己的 this,不能用作构造函数
箭头函数与普通函数区别:
(1)箭头函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。例子:
var person = {
name: '叮当猫',
sayName:function () {
console.log(this.name)
},
sayHi: function(){
(() => { console.log('hi') ; this.sayName() })()
}
}
person.sayHi()
// hi
// 叮当猫
// hi
//Uncaught TypeError: this.sayName is not a function
at :7:44
at Object.sayHi
at :10:14
并且箭头函数的this是固定的。不是可变的。
(2)不可以当作构造函数,箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数。
var func= ()=>{this.name = 'ss'}
var personOne = new func()
//VM708:2 Uncaught TypeError: func is not a constructor
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
我也来献个丑:
箭头函数是ES6的写法,与function最大的不同是this的指向问题,
箭头函数内部的this 是继承自其上一级
而function 的this是看情况指向的,一般优先级是 new > bind > obj. > window
new 的本质是生成一个新对象,将对象的_proto_指向函数的prototype,再执行call 方法,最后将新对象赋给定义的对象,
而箭头函数既无自己的this,也没有prototype 所以不行。
前端新手,有错误的话请不要客气,直接指出,谢谢。
没有自己的this,无法指向自身。构造函数生成对象需要调用函数初始化属性。
箭头函数不能通过new关键字调用原因
JavaScript
函数两个内部方法:[[Call]]
和[[Construct]]
直接调用时执行
[[Call]]
方法, 直接执行函数体new
调用时执行[[Construct]]
方法, 创建一个实例对象blabla(如下)箭头函数并没有
[[Construct]]
方法, 所以不能被用作构造函数另外, 可以参考
Proxy
中的handler.construct
方法区别:
1.箭头函数没有自己的
this
属性、arguments
属性、而普通函数有,箭头函数的this指向当前函数作用域的this
。new:
2.箭头函数没有
prototype
显示原型,所以不能作为构造函数。箭头函数带来的好处:
var that = this
的事没少干,有了箭头函数,就不需要这么写了。"函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。" 也不能说是定义时所在的对象吧,应该是定义时所在的作用域中的 this 值,因为 JS 的静态作用域的机制,this 相当于一个普通变量会向作用域链中查询结果,同时定义时所在对象也并不等于所在对象中的 this 值。
引入箭头函数有两个方面的作用:更简短的函数并且不绑定this。箭头函数与普通函数不同之处有:
箭头函数是普通函数的简写,可以更优雅的定义一个函数,和普通函数相比,有以下几点差异:
1、函数体内的 this 对象,就是定义时所在的对象,而不是使用时所在的对象。
2、不可以使用 arguments 对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
3、不可以使用 yield 命令,因此箭头函数不能用作 Generator 函数。
4、不可以使用 new 命令,因为:
new 过程大致是这样的: