前置知识点:
-
在es5中只有全局作用域和函数作用域,而es6中新增了一个块级作用域,就是可以在js文件里任意出使用{ }形成相对独立的作用域(一般用于if和for内部)。
-
变量提升:先解析代码,获取所有声明的变量,然后代码自上而下依次运行将变量提升到自身所在作用域的头部,这将导致脚本还未执行,而变量却存在,只不过变量的值为undefined。因此注意:变量声明可以提升 但是赋值初始化不提升。
-
计算机语言从右往左的解读模式让
var a = b = 1;
b 为未被定义,直接被认为是全局变量,而var a被定义在当前作用域下,严格模式下这个b会undefined。//经典代码题 console.log(v1); var v1 = 100; function foo() { console.log(v1); var v1 = 200; console.log(v1); } foo(); console.log(v1);
结果是:
-
题目一:
var a,b; (function(){ alert(a); alert(b); var a=b=3; alert(a); alert(b); })(); alert(a); alert(b);
这里的问题是var a=b=3,从右向左解读被看成b=3和var a = b,a是当前函数作用域内的变量,b是全局变量,a在执行完赋值语句后,函数内为3,函数外还是undefined,而b这里就是全局变量,执行完成之后都是3。所以答案是:
undefined,undefined,3,3,undefined,3
-
const相关。
第一个会报错TypeError,第二个却会输出3和12。因为const定义的值是无法修改的,如果是基本类型,保存的就是这个值,但是对象保存的是内存的地址,而const的这个定义是作用在对象保存的这个地址上的,只要你不修改引用,那么就不违背const定义,这里只是操作了指向的那个对象而已,因此毫无影响。
-
异步同步。执行顺序是同步→异步(微→宏)→回调。promise是微任务。
- 变量回收机制。
第二行的var无效,i=2的值覆盖第一个。add右边是立即执行函数,如果没有闭包的话i会被回收。
- 变量回收机制。