首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

论普通函数和箭头函数的区别以及箭头函数的注意事项、不适用场景

答案是:ES6的rest参数(...扩展符) rest参数获取函数的多余参数 这是ES6的API,用于获取函数不定数量的参数数组,这个API是用来替代arguments的,API用法如下: let a...x * x; }); // 普通函数写法 [1,2,3].map(x => x * x); // 箭头函数只需要一行 --- 箭头函数的注意事项及不适用场景 箭头函数的注意事项 一条语句返回对象字面量...list let c = false || (() => {}); // ok 箭头函数不适用场景: 围绕两点:箭头函数的this意外指向和代码的可读性。...调用箭头函数会报错,因为箭头函数没有constructor 箭头函数不支持new.target 箭头函数不支持重命名函数参数,普通函数的函数参数支持重命名 箭头函数相对于普通函数语法更简洁优雅 箭头函数的注意事项及不适用场景...箭头函数的注意事项: 箭头函数一条语句返回对象字面量,需要加括号 箭头函数在参数和箭头之间不能换行 箭头函数的解析顺序相对||靠前 不适用场景:箭头函数的this意外指向和代码的可读性。

1.5K00
您找到你想要的搜索结果了吗?
是的
没有找到

浅浅的分析下es6箭头函数

var demo=num1=>5675; //场景3:有多个参数 var demo=(num1,num2)=>5675; //场景 4 :有多个参数 ,并且需要语句块 var demo=(num1...适用场景 以下逻辑参考《你不知道的js》,请根据自己的需要进行选择是否使用箭头函数。 ?...不适用场景 定义对象方法 一般情况下如果想定义对象下的函数,是多少涉及使用对象中的其他属性的,如果用箭头函数会因为对象无法形成作用域,没有相关上下文,导致this指向全局。...let bird=()=>{ console.log(this) } let xique=new bird()//bird is not a constructor 逻辑判断过于复杂 这时候逻辑过于复杂使用箭头函数会导致代码结构不清楚...总之,个人的建议是:上面提到的几种不适合的场景不要用箭头函数。箭头函数适用于那些参数业务逻辑以及返回值都简单的方法的实现。

33810

JSDoc支持_TypeScript笔记19

一.JSDoc 与类型检查 .js文件里不支持 TypeScript 类型标注语法: // 错误 'types' can only be used in a .ts file. let x: number...; 因此,对于.js文件,需要一种被 JavaScript 语法所兼容的类型标注方式,比如JSDoc: /** @type {number} */ let x; // 错误 Type '"string"...; 对象类型也通过对象字面量来描述,索引签名同样适用: /** @type {{ a: string, b: number }} */ var obj; obj.a.toLowerCase(); /*...{string} [p3 = 'test'] - 有默认值的可选参数(JSDoc语法) */ function fn(p1, p2, p3) {} P.S.注意,后缀等号语法(如{string=})不适用于对象字面量类型...Class,构造函数不适用: /** * @constructor */ function Animal() { this.alive = true; } /** * @constructor

4.1K10

JS 到底是在干嘛:一文搞懂JS 执行上下文

提升的规则 提升只适用于函数声明,而不适用于表达式。下面是代码执行将中断的函数表达式示例。...这就是我们得到错误的原因: 另外,变量提升不适用于let或const关键字初始化的变量。...js console.log(名称);let name = "Victor";将抛出错误: 创建阶段:创建作用域链 在创建了变量对象(VO)之后,就开始创建作用域链,作为执行上下文创建阶段的下一个阶段...记住,GEC只适用于不在任何函数内的JavaScript代码(变量和函数)。因为它们没有在任何函数中定义,所以函数声明在GEC中。现在明白了吗?...创建“this”对象,但是可以访问定义它的环境的对象。通常是window对象。

31610

JS到底是怎么执行的:一文彻底搞清执行上下文

提升的规则 提升只适用于函数声明,而不适用于表达式。下面是代码执行将中断的函数表达式示例。...这就是我们得到错误的原因: 另外,变量提升不适用于let或const关键字初始化的变量。试图在声明之前访问一个变量,然后使用let和const关键字声明它,将导致ReferenceError。...js console.log(名称);let name = "Victor";将抛出错误: 创建阶段:创建作用域链 在创建了变量对象(VO)之后,就开始创建作用域链,作为执行上下文创建阶段的下一个阶段...记住,GEC只适用于不在任何函数内的JavaScript代码(变量和函数)。因为它们没有在任何函数中定义,所以函数声明在GEC中。现在明白了吗?...JavaScript中的全局执行上下文与函数执行上下文 既然你已经看到这里了,现在让我们用一个表格总结一下GEC和FEC之间的要点: 创建全局变量对象。

1.3K60

《JavaScript高级程序设计》读书笔记

为了保证 js 正常运行,用 CDATA 来包裹。...arguments.callee 指向函数自身,用于编写递归函数。 注意:js 的函数没有重载。ts 可以重载,但是也只是多类型声明,不符合传统意义的函数重载。...的引用次数和obja的引用次数再+1 // obja 和 obj2 的引用次数均是2 // 变量永远不会被清除,造成内存泄漏 } 4.3.3 性能优化 在优化性能问题上,IE6 根据固定的内存分配量来触发...instanceof 不适用于网页包含多个框架,2 个运行环境,从一个向另一个传入数组构造函数,严格意义上并不相等。...如果将 var 换成 let,则不存在这个问题。虽然变量i生命被延长,也属于 createFunction作用域,但是let本身是“块级作用域”。

1.1K20

揭秘箭头函数

arrowFunctionWithOneParam = (number) => number + 1; const arrowFunctionWithMultipleParams = (numberOne, numberTwo) => { let...当 JS 引擎执行 arrowFunctionExecution() 时,它会创建一个函数,执行上下文并被推送到调用堆栈。 一旦创建了执行上下文,它就会启动创建阶段。...这些函数也不适用于 call、apply 和 bind 方法,这些方法通常依赖于作用域。 如果您还没有阅读过 JavaScript 中的作用域,我建议您阅读 这篇文章。 4....,因为它们也是函数表达式,其中函数被分配为变量的值。...当 JavaScript 引擎执行上述代码时,在创建阶段,声明语句 var amIGoingToBeHoisted 将被移到顶部并使用值 undefined 进行初始化,而将初始值留在后面。

1.1K20

❤万字长文JS全网最细笔记①(全网最强,建议收藏)❤

引用外部 JS文件的 script 标签中间不可以写代码,这个情况适用于JS 代码量比较大的情况。...使用该关键字声明变量后,计算机会自动为变量分配内存空间,不需要程序员管,name是程序员定义的变量名,我们要通过变量名来访问内存中分配的空间。...var age = 10, name = 'XiaoLin'; 声明变量特殊情况 情况 说明 结果 var age ; console.log (age); 只声明 赋值 undefined...console.log(age) 声明 赋值 直接使用 报错 age = 10; console.log (age); 声明 只赋值 10 4.6、变量命名规范     变量的命名遵循以下规则:...(var_name) let let_name = "456" let let_name = "XiaoLin" console.log(let_name) ?

91320

模块化-CommonJs、AMD、CMD

// module1.js var data = 5; var doSomething = function (value) { return value + data; }; // 暴露的接口 module.exports.data...由于Node.js主要用于服务器编程,加载的模块文件一般都存在本地硬盘,加载起来比较快,不用考虑异步加载的方式,因此,CommonJS规范比较适用。...然而,这并不适合在浏览器环境,同步意味着阻塞加载,浏览器资源是异步加载的,鉴于浏览器的情况,为了解决上述同步加载问题,实现异步加载依赖模块,因此有了AMD、CMD解决方案。...// a.js (定义模块) var data = 'aaa' var doSomething = function () { console.log('log: ' + data) }; export...我们来看看第一个差异,CommonJS模块的加载机制: // module1.js var data = 5; var doSomething = function () { data++; };

38230

js作用域链与预解析

可以在程序任何地方拿到 1 2 var a = "全局变量a" 3 let b = "全局变量b" 4 const c = "全局变量...(函数执行完内部变量就会被js销毁,除非使用闭包) 1function aaa(params) { 2 var bb = "bb"; 3} 4 5console.log(bb);//bb is not...defined 1.3 块级作用域 只适用于let、const,被这俩关键字定义的变量会产生块级作用域。...大括号之外不能访问,比如if、for循环... 1if (true) { 2 var a = "a"; 3 let b = "b"; 4 const c = "c"; 5} 6 7console.log...预解析 js运行分为两步:预解析,代码执行 预解析:var声明的变量(赋值)和函数,会被提升到当前作用域最前面 代码执行:按照代码书写的顺序从上往下执行 预解析优先级: 函数>变量 因为函数提升是整体提升

40710

call、apply、bind的应用和区别

1. call( ) 面试中常问的Js中关于call、apply、bind的问题,比如: 怎么利用call、apply来求一个数组中最大或者最小值 如何利用call、apply来做继承 apply、call...并且把对应的参数值准备好,以后要用到了,直接的执行即可,也就是说bind同样可以改变this的指向,但和apply、call不同就是不会马上的执行(如上一个例子) 注意:bind这个方法在IE6~8下兼容...undefined); // 普通模式下this是window,在严格模式下this是undefined 应用 ① 将伪数组转化为数组(含有length属性的对象,dom节点, 函数的参数arguments) js...arr2 = Array.prototype.slice.call(div); console.log(arr2); // 数组 [div.div1, div.div1, div.div1] 但是这个不适用于...case3: 含有length属性的对象 ② 数组拼接,添加 let arr1 = [1,2,3]; let arr2 = [4,5,6]; //数组的concat方法:返回一个新的数组 let arr3

35650

❤ 就这?TypeScript其实并不难!(建议收藏)❤

TypeScript可以让JS开发大型企业应用,即适用于大型应用 或 多人协作 最新的Vue、React也可以集成TypeScript 谷歌也在大力支持TypeScript的推广,谷歌的angular2...) boolean (ts中布尔值只有true和false两个) (0和null在ts中表示false了) var b:boolean = true var c:boolean =...早期只有局部变量和全局变量 但是比如我们的大众语言,java,c++ 她们的变量都是以大括号{}为区域划分的 所以js经常被吐槽说,js不适合大型项目开发 因为很容易引起内存溢出 因为它没有变量作用域...因为它自动帮我们把let转译成了var 我们在构建编译好的js文件中可以查到 我们尝试在js文件中,把var修改成let 我们会发现会报错,说明我们的块级作用域还是起作用了 07 引用类型的数组 我们之前讲的都是值类型...02-27T14:57:00') console.log(d1) console.log(d2) console.log(d3) 还有更多语法如下,几乎和js是一样的,赘述 let d:Date

1.5K20

JavaScript: 前端拾遗-ES6基础

箭头函数和普通函数的区别 箭头函数是匿名函数,不能作为构造函数,不能使用new 箭头函数绑定arguments,取而代之用rest参数 (...rest) 箭头函数绑定this,会捕获其所在的上下文的...this值,作为自己的this值.其中需要注意的是: 箭头函数的 this 永远指向其上下文的 this ,任何方法都改变不了其指向,如 call() , bind() , apply() var...,let,const 的使用和区别 1、在 ES6之前,ES5中js只有全局作用域和函数作用域,let ==增加了块级作用域== if(true) { let a = 'name' } console.log...可以重复声明变量,但是 ==let 不允许在同一块作用域内重复声明同一个变量==, 和 const 不能重复命名 4、==let 不允许设置全局变量==,var 可以 const 不能修改值...以上 let 的规则同样适用于 const,但是跟 let 的区别是 const 声明的变量不能重新赋值,所以 const 声明的变量必须经过初始化。

24210

那些高级前端是如何回答面试题的_2023-02-28

+交换到底有多少轮 for (let i = 0; i < len; i++) { // 内层循环用于完成每一轮遍历过程中的重复比较+交换 for (let j = 0; j < len...return res; } apply 描述:与 call 类似,唯一的区别就是 call 是传入固定个数的参数,而 apply 是传入一个参数数组或类数组。...比如 focus、blur 之类的事件没有事件冒泡机制,所以无法实现事件委托;mousemove、mouseout 这样的事件,虽然有事件冒泡,但是只能不断通过位置去计算定位,对性能消耗高,因此也是不适合于事件委托的...剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。 环路等待条件:在发生死锁时,必然存在一个进程——资源的环形链。...预防死锁的方法: 资源一次性分配:一次性分配所有资源,这样就不会再有请求了(破坏请求条件) 只要有一个资源得不到分配,也不给这个进程分配其他的资源(破坏请保持条件) 可剥夺资源:即当某进程获得了部分资源

68310
领券