let 声明的变量只在所在的代码块有效。
{ let name = "kevin"; var age = 20; console.log(name); //kevin console.log(age); //20 } console.log(name); //a is not defined console.log(age); //20
for循环
let在循环体内有作用
for (let i = 0; i < 3; i++) { console.log("i: ",i ); //i:0 i:1 i:2 }
console.log(i) //is not defined
for循环还有一个特别之处,就是设置循环变量的那部分是一个父级作用域,循环体内部是一个单独的子作用域
for (let ii = 0; ii < 3; ii++) { let ii = "kevin"; console.log("ii: ",ii ); //输出3次Kevin }
不存在变量提升:
与var的区别
console.log(name); //undefined var name = "kevin"; console.log(age); //报错ReferenceError let age = 20;
var sex = "girl"; { let sex ="boy"; console.log(sex); //boy } console.log(sex); //girl
将上面代码改写成
var sex = "girl"; { sex ="zhongxing"; let sex ="boy"; console.log(sex); //报错ReferenceError } console.log(sex);
这段代码报错被称为:暂时性死区。
暂时性死区的本质是:只要一进入当前作用域,所要使用的变量就存在了,但不可取,只有声明后才可取和使用。
2.块级作用域
es5只有全局作用域和函数作用域,没有全局作用域。es6增加了块级作用域。
es6:
function fn(num) { let nums = 10; if(true){ let nums = 20; } console.log(nums); //10 } fn(8);
es5:
function fn(num) { var nums = 10; if(true){ var nums = 20; } console.log(nums); //20 } fn(8);
es6允许块级作用域任意嵌套。外层作用域无法读取内层作用域的变量。内层作用域可以定义外层作用域同名的变量。
{{{{{let insane = 'Hello World'}}}}};
const声明一个只读的常量。一旦声明变量,常量的值就不能变化。就必须立即初始化。不能留到以后赋值。const的作用域和let相同:只在声明的块级有效。同样存在暂时性死区
const PI =3.14; { const PI = 3; console.log(PI); //3 } console.log(PI); //3.14