-
块内变量内部无法访问
if(true){let foo = "mcgee0731"} console.log(foo); //foo is not defined ... for(let i=0;i< 3;i++>){} console.log(i) //i is not defined
-
var 对循环的影响
for(var i=0;i< 3;i++){for(var i=0;i< 3;i++){console.log(i); } } // 内层循环完后 `i = 3` 到外层循环时, 无奈再进入。打印 0,1,2 三次而不是九次
// 循环内处理事件时,事件内拜访计数器 var events = [{},{},{}] for(var i=0;i< events.length;i++){events[i].onclick = function(){console.log(i) } } events[0].onclick() // 无论哪一项输入都是 3
-
通过 IIFE 模式处理事件计数器绑定
// 应用闭包解决变量 var events = [{},{},{}] for(var i=0;i< events.length;i++){events[i].onclick = (function(i){return function(){console.log(i) } })(i) } events[0].onclick() //0
-
应用 let 解决 for 循环的问题
for(let i=0;i< 3;i++){for(let i=0;i< 3;i++){console.log(i); } } ... var events = [{},{},{}] for(let i=0;i< events.length;i++){events[i].onclick = function(){console.log(i) } } events[0].onclick() //0
- for 循环内有两层作用域,咱们对上面的办法进行拆解
for(let i =0;i < 3;i++){
let i = "foo"
console.log(i);
}
拆解成...
let i =0; // 这是 for 循环的作用域
if(i<3){let i = "foo" // 这个 n 是块内的 n,}
i++
会执行三次
-
不存在变量晋升
console.log(bar); // 报错 ReferenceError let bar = 2;
- 做一个小案例
每次都是在新词法作用域创立个 str=””+ 每次的 i
for(var i=0;i<1000;i++)
{
let str = ""
str+=i
}
-
为什么须要块级作用域
- 变量晋升导致报错
- 外部变量泄露
- 匿名立刻执行函数表达式(IIFE)不再必要了
-
函数在块级作用域内
- 容许在块级作用域内申明函数。
- 函数申明相似于 var,即会晋升到全局作用域或函数作用域的头部。
- 同时,函数申明还会晋升到所在的块级作用域的头部。
const
-
只读的常量。一旦申明,常量的值就不能扭转
const PI = 3.1415; PI = 3;
-
const 申明不赋值报错
const obj
- const 对于对象,绑定对象的地址值并且无奈改变,地址值内的属性成员能够改。
- ES2015 申明的 6 种办法,
var function let const import class
- 主用 const,须要改变的用 let,不必 var