怎样看一个网站是不是织梦做的,做网站需要公司资料吗,自适应网站开发,暑假旅游最适合的城市前言
说到箭头函数#xff0c;可能很多人的第一反应就是和普通函数的区别#xff1a;
箭头函数没有 this#xff0c;普通函数的 this 指向依赖它是如何被调用的箭头函数没有 arguments 对象#xff0c;而是通过剩余参数#xff08;rest parameters#xff09;来获取所有…前言
说到箭头函数可能很多人的第一反应就是和普通函数的区别
箭头函数没有 this普通函数的 this 指向依赖它是如何被调用的箭头函数没有 arguments 对象而是通过剩余参数rest parameters来获取所有参数的值箭头函数没有 prototype 原型不能用作构造函数而普通函数可以更加简洁的函数语法
相信一名前端开发者对于这两者的区别多多少少都能罗列一些但是你们有没有想过JS已经有普通函数了为什么还要有箭头函数难道仅仅只是语法简洁可读性好这么简单
答案只有一个消除函数的二义性。
函数的二义性
那什么是函数的二义性呢
我们创建一个普通函数
function user(){}这个时候就会出现歧义因为这个函数有两种调用方式
function user(){};// 普通方式调用
user();// 当做构造函数调用
new user();这就是函数的二义性至于为什么会出现这种情况这个就要追溯到 JS 的历史渊源了我感觉应该是 JS 这门语言在设计上的缺陷。
因为函数的二义性导致 JS 函数的复杂度直线上升因为函数在创建的时候创建者不知道未来的调用者如何调用可能直接调用也有可能通过 new 方法调用这就会存在很大的安全隐患。
后来开发者就在函数的命名上定义了一套规范普通函数首字母小写构造函数首字母大写就像下面这样
// 普通函数
function user(){};// 构造函数
function User(){};但毕竟这个不是强约制性的普通函数依旧可以使用 new 调用这只能说在一定程度上稍微缓解了这个问题就像 JS 一些构造函数一样两种调用方式都可以比如
// Number
Number();
new Number()// Date
Date();
new Date();如果你想普通函数不能通过 new 来调用你可以这么做
function User(){if(new.target){throw(Uncaught TypeError: User is not a constructor)}
}所以调用者压根就不清楚函数的调用方式这个函数的二义性会给开发者造成心智负担。 官方一直都知道这个问题只是一直没解决后来ECMAScript 6在给 JS 打补丁的时候引入了两个概念
箭头函数class实例
它们的作用都是为了消除函数的二义性。
箭头函数只能这样调用
const user () {};// 报错 Uncaught TypeError: user is not a constructor
const a new user();// 正确
user();class 只能这样调用
class User{};// 报错 Uncaught TypeError: Class constructor User cannot be invoked without new
const user User();// 正确
const user new User();箭头函数
那为什么箭头函数里边没有this和原型
const user () {};
console.log(user.prototype); // undefined因为箭头函数跟实例无关跟面向对象没关系它已经脱离了面向对象的范畴而 this 哪来的this 来自于面向对象里面的概念箭头函数里面没有原型的概念是一样的。