失效链接处理 |
ES6 学习笔记 PDF 下载
本站整理下载:
相关截图:
主要内容:
块级绑定
var声明变量的问题
使用var声明变量
1. 允许重复的变量声明:导致数据被覆盖
2. 变量提升:怪异的数据访问、闭包问题
3. 全局变量挂载到全局对象:全局对象成员污染问题
// 1. 允许重复的变量声明:导致数据被覆盖 var a = 1; function print(){ console.log(a) }//假设这里有一千行代码 var a = 2; print(); // 2. 变量提升:怪异的数据访问 if (Math.random() < 0.5) { var a = "abc"; console.log(a); }else {console.log(a); }console.log(a); // 2. 变量提升:闭包问题 var div = document.getElementById("divButtons") for (var i = 1; i <= 10; i++) { var btn = document.createElement("button"); btn.innerHTML = "按钮" + i; div.appendChild(btn); btn.onclick = function () { console.log(i); //输出11 } }// 循环结束后,i:11
// 3. 全局变量挂载到全局对象:全局对象成员污染问题 var abc = "123"; console.log(window.abc); var console = "abc"; console.log(console) var name = "abc";
使用let声明变量
ES6不仅引入let关键字用于解决变量声明的问题,同时引入了块级作用域的概念
块级作用域:代码执行时遇到花括号,会创建一个块级作用域,花括号结束,销毁块级作用域
声明变量的问题
1. 全局变量挂载到全局对象:全局对象成员污染问题
let声明的变量不会挂载到全局对象
let a = 123; //let a = 456; // 检查到,当前作用域(全局作用域)已声明了变量a //let a = 123; function test(){ let a = 456; console.log(a)//456 }test(); 2. 允许重复的变量声明:导致数据被覆盖
let声明的变量,不允许当前作用域范围内重复声明
在块级作用域中用let定义的变量,在作用域外不能访问
let a = 123; //全局作用域定义a { let a = 456; //块级作用域定义a console.log(a); //使用的是块级作用域中的a }console.log(a) if (Math.random() < 0.5) { let a = 123; //定义在当前块级作用域 console.log(a) //当前块级作用域中的a }else {//这是另外一个块级作用域,该作用域中找不到a console.log(a) }console.log(a); 3. 变量提升:怪异的数据访问、闭包问题
使用let不会有变量提升,因此,不能在定义let变量之前使用它
底层实现上,let声明的变量实际上也会有提升,但是,提升后会将其放入到“暂时性死区”,如果访
问的变量位于暂时性死区,则会报错:“Cannot access 'a' before initialization”。当代码运行到该
变量的声明语句时,会将其从暂时性死区中移除。
console.log(a) let a = 123;
在循环中,用let声明的循环变量,会特殊处理,每次进入循环体,都会开启一个新的作用域,并且将
循环变量绑定到该作用域(每次循环,使用的是一个全新的循环变量)
在循环中使用let声明的循环变量,在循环结束后会销毁
|