块内变量内部无法访问
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); // 报错ReferenceErrorlet 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