一、块级作用域与嵌套、let、暂时性死区

ES6+前导以及回忆知识

有些浏览器不兼容ES6+语法:

解决方案:ES6+ ——编译器(例如babel)——> ES5

而babel这种工具需要包管理工具,例如npm来安装。(这里包package代表代码块/功能块)。

而npm只能在node环境中实现;node也是能运行js代码的环境。

共享包:git工具,代码管理工具。


函数执行前预编译过程:AO,即生成函数上下文过程:

  1. 寻找函数形参和变量声明提升
  2. 把实参赋值给形参
  3. 寻找函数声明,赋值函数体
  4. 然后执行函数。(不属于预编译过程,执行完毕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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值