1. 谈谈你对 JS 执行上下文栈和作用域链的理解.
执行上下文就是当前 JavaScript 代码被解析和执行时所在环境, JS 执行上下文栈可以认为是一个存储函数调用的栈结构, 遵循先进后出的原则.
1.JavaScript 执行在单线程上, 所有的代码都是排队执行.
2. 一开始浏览器执行全局的代码时, 首先创建全局的执行上下文, 压入执行栈的顶部.
3. 每当进入一个函数的执行就会创建函数的执行上下文, 并且把它压入执行栈的顶部. 当前函数执行 - 完成后, 当前函数的执行上下文出栈, 并等待垃圾回收.
4. 浏览器的 JS 执行引擎总是访问栈顶的执行上下文.
5. 全局上下文只有唯一的一个, 它在浏览器关闭时出栈.
作用域链: 无论是 LHS 还是 RHS 查询, 都会在当前的作用域开始查找, 如果没有找到, 就会向上级作用域继续查找目标标识符, 每次上升一个作用域, 一直到全局作用域为止.
2. 在 JS 中什么是变量提升? 什么是暂时性死区?
变量提升就是变量在声明之前就可以使用, 值为 undefined.
在代码块内, 使用 let/const 命令声明变量之前, 该变量都是不可用的(会抛出错误). 这在语法上, 称为 "暂时性死区". 暂时性死区也意味着 typeof 不再是一个百分百安全的操作.
- typeof x; // ReferenceError(暂时性死区, 抛错)
- let x;
- typeof y; // 值是 undefined, 不会报错
暂时性死区的本质就是, 只要一进入当前作用域, 所要使用的变量就已经存在了, 但是不可获取, 只有等到声明变量的那一行代码出现, 才可以获取和使用该变量.
3. prototype 和 __proto__ 区别是什么?
prototype 是构造函数的属性.
__proto__ 是每个实例都有的属性, 可以访问 [[prototype]] 属性.
实例的 __proto__ 与其构造函数的 prototype 指向的是同一个对象.
- function Student(name) {
- this.name = name;
- }
- Student.prototype.setAge = function(){
- this.age=20;
- }
- let Jack = new Student('jack');
- console.log(Jack.__proto__);
- //console.log(Object.getPrototypeOf(Jack));;
- console.log(Student.prototype);
- console.log(Jack.__proto__ === Student.prototype);//true
4. ES6 新的特性有哪些?
1. 新增了块级作用域(let,const)
2. 提供了定义类的语法糖(class)
3. 新增了一种基本数据类型(Symbol)
4. 新增了变量的解构赋值
5. 函数参数允许设置默认值, 引入了 REST 参数, 新增了箭头函数
6. 数组新增了一些 API, 如 isArray / from / of 方法; 数组实例新增了 entries(),keys() 和 values() 等方法
7. 对象和数组新增了扩展运算符
8.ES6 新增了模块化(import/export)
9.ES6 新增了 Set 和 Map 数据结构
10.ES6 原生提供 Proxy 构造函数, 用来生成 Proxy 实例
11.ES6 新增了生成器 (Generator) 和遍历器(Iterator)
5. setTimeout 倒计时为什么会出现误差?
setTimeout() 只是将事件插入了 "任务队列", 必须等当前代码 (执行栈) 执行完, 主线程才会去执行它指定的回调函数. 要是当前代码消耗时间很长, 也有可能要等很久, 所以并没办法保证回调函数一定会在 setTimeout() 指定的时间执行. 所以, setTimeout() 的第二个参数表示的是最少时间, 并非是确切时间.
html5 标准规定了 setTimeout() 的第二个参数的最小值不得小于 4 毫秒, 如果低于这个值, 则默认是 4 毫秒. 在此之前. 老版本的浏览器都将最短时间设为 10 毫秒. 另外, 对于那些 DOM 的变动(尤其是涉及页面重新渲染的部分), 通常是间隔 16 毫秒执行. 这时使用 requestAnimationFrame() 的效果要好于 setTimeout();
6. promise 有几种状态, Promise 有什么优缺点 ?
promise 有三种状态: fulfilled, rejected, resolved.
Promise 的优点:
1. 一旦状态改变, 就不会再变, 任何时候都可以得到这个结果
2. 可以将异步操作以同步操作的流程表达出来, 避免了层层嵌套的回调函数
Promise 的缺点:
1. 无法取消 Promise
2. 当处于 pending 状态时, 无法得知目前进展到哪一个阶段
读者福利(学习分享)
对于很多初级 web 前端工程师而言, 想要提升技能, 往往是自己摸索成长, 不成体系的学习效果低效漫长且无助.
整理的这些架构技术希望对 Web 前端开发的朋友们有所参考以及少走弯路, 本文的重点是你有没有收获与成长, 其余的都不重要, 希望读者们能谨记这一点. 同时我经过多年的收藏目前也算收集到了一套完整的学习资料, 希望对想成为架构师的朋友有一定的参考和帮助.
资料免费领取方式: 官方企鹅群: 956766604(持续招募中)
下面是部分资料截图
来源: http://www.jianshu.com/p/e99721d4deef