1.变量提升:
console.log( a ); => undefined
var a = 0;
上面两行代码等同于
var a;
console.log( a );
a = 0;
2.块级作用域
if( true ) {
var a = 0;
}
console.log( a ); => 0
es5 没有块级作用域,有函数作用域
3.es6 变量提升
console.log( a ); => 报错
let a = 0;
es6 块级作用域
if( true ) {
let a = 0;
}
console.log( a ); => 报错
最简单的,比如说 for(var i = 0; i < 10; i ++){},i在for循环之后还会存在,还能被调用,i的值还会被保存,这个就可能导致bug的出现了
1.变量提升。
使用let你在一个变量声明之前使用是会报错的。但是var就正常。
比如:
又比如你变量声明的是一个函数:
2.块作用域和函数作用域。
ES5是函数作用域,也就是说,在ES5中函数的那对大括号{}才看成一个块。而for这类循环不会。但是ES6将所有的{}都看成一个单独的代码运行块:就是说,{}代码块运行的时候会创建自己的运行环境,你可以想象成一个房子,在进去运行的时候,他会将参数带进去,在里面完成自己所有的操作,变量的声明也只对他自己有效。当代码块运行结束了,就返回运行结果(如果有)并销毁自己的房子和房子里的一切。
举个栗子
为什么ES6规定成块作用域呢?
欢迎来到JavaScript的进阶 课后作业! 希望能够帮到你~
个人认为变量提升和无块级作用域本身就不规范,应该摒弃掉。