window.global_a = ‘a‘ var global_a = ‘b‘ window.global_a // ‘b‘ const global_b = ‘const b‘ window.global_b = ‘window b‘ window.global_b // ‘window b‘
{ let global_d = ‘let d‘ var global_e = ‘var e‘ console.log(global_d) // ‘let d‘
} // console.log(global_d) // 报错:global_d is not defined 且不继续往下执行 console.log(global_e) // var e
在for循环计数器
for(let i = 0; i < 3; i++){ // 此处设置循环变量的是for循环计数器的父作用域 // 此处是for循环计数器的子作用域 i = ‘abc‘ // 此处覆盖i变量的值,i一旦被改变,循环计数器执行一次后跳出循环 console.log(i) // 这里只执行一次打印 abc } for(let i = 0; i < 3; i++){ let i = ‘abc‘ // 子作用域再次声明同名的i变量 不会覆盖父作用域的i变量 console.log(i) // for循环执行三次 打印三次 abc } // console.log(i) // 在外面读取i变量会报错: i is no defined for(var j = 0; j < 3; j++){ j = ‘efg‘ // 覆盖上面的j变量 console.log(j) // 打印一次 } for(var j = 0; j < 3; j++){ var j = ‘efg‘ // 覆盖上面的j变量 console.log(j) // 打印一次 }
var for_a = [] for(var i = 0; i < 3; i++){ for_a[i] = function(){ console.log(i) } } for_a[2]() // 3
// var 声明的i是全局变量,每次循环i的值都会被更新,for循环结束后 执行for_a[2] 方法打印的i是最新的值
for(let i = 0; i < 3; i++){ for_a[i] = function(){ console.log(i) } } for_a[0]() // 0 for_a[2]() // 2 i是let声明的变量,每次循环相当于重新创建新的i变量,由于JavaScript引擎会记住上一轮循环的值,因此每次循环的值都会被单独记录下来
不会变量提升
// 不会变量提升 console.log(global_f) // undefined // var 变量会变量提升 即脚本运行时global_f 已经存在了,只是还没被赋值,所以打印undefined var global_f = ‘var f‘ console.log(global_g) // 报错:Cannot access ‘global_g‘ before initialization // 不会变量提升,这之前没有声明global_g 也就不存在过,打印就出错 let global_g = ‘let g‘
暂时性死区
var global_h = ‘var h‘ { // let只要在块级作用域内声明变量,就会与这个作用域绑定 // global_h = ‘var h h‘ // 所以在let声明global_h 变量前 对该变量赋值会报错 // 暂时性死区也意味着 typeof global_h 也会报错而检查不出变量类型 typeof x // undefined x未被声明过 let global_h = ‘let h‘ // Cannot access ‘global_g‘ before initialization }
不允许重复声明
// 在相同作用域下let不允许重复声明变量,否则报错 { var global_i = ‘var i‘ let global_i = ‘let i‘ // 报错:Identifier ‘global_i‘ has already been declared } { let global_j = ‘let j‘ let global_j = ‘let j1‘ // 报错:Identifier ‘global_j‘ has already been declared { let global_j = ‘let j2‘ //不报错,这是一个单独的子作用域 } } { let global_k = ‘let k‘ var global_k = ‘var k‘ // 报错:Identifier ‘global_k‘ has already been declared }
//const跟let一样有块级作用域,同样变量不提升,有暂时性死区, 同一作用域下也是不能再次被声明
//const声明一个只读的变量,一旦声明,常量的值就不可被改变 const global_l = ‘const l‘ // global_l = ‘const l1‘ // 报错:Identifier ‘global_i‘ has already been declared // const global_l = ‘const l2‘ // 报错:Identifier ‘global_l‘ has already been declared
原文:https://www.cnblogs.com/zhangky/p/12213170.html