1、解释一下什么是闭包 ?
闭包:就是能够读取外层函数内部变量的函数。
闭包需要满足三个条件:
访问所在作用域;
函数嵌套;
在所在作用域外被调用 。
优点: 可以重复使用变量,并且不会造成变量污染 。
缺点: 会引起内存泄漏
使用闭包的注意点:
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象
(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
2. 说一下 ES6 中你熟悉的一些内容 ?
class 类的继承ES6中不再像ES5一样使用原型链实现继承,而是引入Class这个概念
async、await使用 async/await, 搭配promise,可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成
Promise是异步编程的一种解决方案,比传统的解决方案(回调函数和事件)更合理、强大
Symbol是一种基本类型。Symbol 通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的
Proxy代理使用代理(Proxy)监听对象的操作,然后可以做一些相应事情
Set是类似于数组的数据集合,无序,插入删除速度快,元素不重复,查找速度快。
Map是一个类似对象的数据结构,和对象不同的在于它的key可以是任意类型,但是对象只能使用string和symbol类型,Map的存储关联性更强
生成器函数可以进行阻断函数执行的过程,通过传参可以传入新的值进入函数继续执行,可以用于将异步变为阻塞式同步
3、什么是事件轮询(EventLoop) ?
一个用来等待和发送消息和事件的程序结构。
1、所有任务都在主线程上执行,形成一个执行栈。
2、主线程发现有异步任务,如果是微任务就把他放到微任务的消息队列里,如果是宏任务就把他放到宏任务的消息队列里。
3、执行栈所有同步任务执行完毕。
4、执行微任务队列,之后再执行宏任务队列。
5、轮询第4步。
4、for 循环与 forEach 的区别 ?
1.for循环可以使用break跳出循环,但forEach不能。
2.for循环可以控制循环起点(i初始化的数字决定循环的起点),forEach只能默认从索引0开始。
3.for循环过程中支持修改索引(修改 i),但forEach做不到(底层控制index自增,无法左右它)。
5、Promise 的使用场景 ?
- 场景1:获取文件信息。
- 场景2:配合AJAX获取信息
- 场景3:解决回调地狱,实现串行任务队列。
- 场景4: node中进行本地操作的异步过程
6、常见的跨域方式 ?
JSONP:
JSONP是利用外链脚本,没有跨源限制的特点,来实现跨源请求的一种技术。
CORS:
cors:跨域资源共享,是一种实现跨源请求数据的技术。这就是跨源问题的解决方案之一。也是广泛的解决方案。
正向代理
先搭建一个属于自己的代理服务器
1、用户发送请求到自己的代理服务器
2、自己的代理服务器发送请求到服务器
3、服务器将数据返回到自己的代理服务器
4、自己的代理服务器再将数据返回给用户
反向代理
1、用户发送请求到服务器(访问的其实是反向代理服务器,但用户不知道)
2、反向代理服务器发送请求到真正的服务器
3、真正的服务器将数据返回给反向代理服务器
4、反向代理服务器再将数据返回给用户
通过postMassage,
7、null 和 undefined 的区别 ?
null是一个表示"无"的对象(空对象指针),转为数值时为0;
undefined是一个表示"无"的原始值,转为数值时为NaN。
拓展:
null表示"没有对象",即该处不应该有值。典型用法是:
作为函数的参数,表示该函数的参数不是对象。
作为对象原型链的终点。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
变量被声明了,但没有赋值时,就等于undefined。
调用函数时,应该提供的参数没有提供,该参数等于undefined。
对象没有赋值的属性,该属性的值为undefined。
函数没有返回值时,默认返回undefined。
8、普通函数与箭头函数的区别 ?
普通函数和箭头函数的区别:
1.箭头函数没有prototype(原型),箭头函数没有自己的this,继承的是外层代码块的this。
2.不可以当做构造函数,也就是说不可以使用new命令,否则会报错的。
3.不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
4.不可以使用yield命令,因此箭头函数不能用作 Generator(生成器) 函数。
5.因为没有this,所以不能使用call、bind、apply来改变this的指向。
9.Promsie 和 async/await 的区别和使用 ?
区别:
1)函数前面多了一个async关键字。await关键字只能用在async定义的函数内。async函数会隐式地返回一个promise,该promise的reosolve值就是函数return的值。
2)第1点暗示我们不能在 外层代码中使用await,因为不在async函数内。使用:
1.async和await是配对使用的,await存在于async的内部。否则会报错 。
2.await表示在这里等待一个promise返回,再接下来执行。
3.await后面跟着的应该是一个promise对象,(也可以不是,如果不是接下来也没什么意义了…)
10、 什么是事件流以及事件流的传播机制 ?
事件触发后,从开始找目标元素,然后执行目标元素的事件,再到离开目标元素的整个过程称之为事件流。
W3C标准浏览器事件流的传播分为3个阶段:捕获阶段、目标阶段、冒泡阶段
捕获阶段指找目标元素的过程,这个找的过程,是从最大的document对象到html,再到body,。。。直到目标元素。
找到目标元素后,调用执行他绑定事件时对应的处理函数,这个过程被称之为目标阶段。
当目标元素的事件执行结束后,再从目标元素,到他的父元素。。。body、html再到document的过程,是冒泡阶段。
11、 less 和 sass 的区别 ?
编译环境不一样,sass是服务器端处理的,可以用Ruby、node-sass来编译;less需要引入less.js来处理输出,也可以使用工具在服务器端处理成css,也有在线编译的。
变量定义符不一样,less用的是@,而sass用$。
sass支持分支语句,less不支持