ES6+前导以及回忆知识
有些浏览器不兼容ES6+语法:
解决方案:ES6+ ——编译器(例如babel)——> ES5
而babel这种工具需要包管理工具,例如npm来安装。(这里包package代表代码块/功能块)。
而npm只能在node环境中实现;node也是能运行js代码的环境。
共享包:git工具,代码管理工具。
函数执行前预编译过程:AO,即生成函数上下文过程:
- 寻找函数形参和变量声明提升
- 把实参赋值给形参
- 寻找函数声明,赋值函数体
- 然后执行函数。(不属于预编译过程,执行完毕AO完整)
函数的参数相当于函数内部声明的变量;
一、块级作用域与嵌套、let、暂时性死区
解决变量污染的原则:KISS原则,keep it simple,stupid。
结论先行:let本质就是为了js增加一个块级作用域。
块级作用域形式上模样:{...}
1.1 let在同一作用域下不可重复声明
同一作用域:块级作用域,函数作用域,全局作用域。
注:块级作用域是他们的子集。
重复声明的例子:
// Uncaught SyntaxError: Identifier 'a' has already been declared
let a = 1;
let a = 2;
// Uncaught SyntaxError: Identifier 'a' has already been declared
function test(){
let b = 1;
var b = 2;
}
test();
函数中的参数相当于在函数内部声明的变量,违反let在同一作用域下不能重复声明的原则。
// Identifier 'a' has already been declared
function test(a){
let a = 1;
}
test();
1.2 let不会声明提升,会产生一个暂时性死区
let不会声明提升,在let声明之前会产生暂时性死区,即无法访问这个变量。
TDZ:temporal DeaD Zone 暂时性死区
声明提升是在预编译的过程中,无论是在函数预编译还是全局预编译。
console.log(a); //undefined
var a = 10;
// Uncaught ReferenceError: Cannot access 'b' before initialization
console.log(b);
let b = 2;
// Uncaught ReferenceError: Cannot access 'b' before initialization
function test(){
console.log(b);
let b = 2;
}
test();
再举一个ES6暂时性死区问题:
// Uncaught ReferenceError: Cannot access 'y' before initialization
function test(x = y, y = 2){
console.log(x,y);
}
test()