在ES5中
ES5中没有块级作用域
在ES5中只有两个东西会形成作用域:1、全局作用域;2、函数作用域
在ES6中
ES6的代码块级作用域
对let/const/function/class声明的类型是有效的
{
let foo='wang'
function demo(){
console.log("demo function")
}
class Person
}
console.log(foo)//foo is not defined
//不同的浏览器是有不同的实现的(大部分浏览器为了兼容以前的代码,让function是没有块级作用域)
demo()//demo function
var p=new Person()//Person is not defined
if语句的代码就是块级作用域
if (true) {
var foo = "foo"
let bar = "bar"
}
console.log(foo)//foo
console.log(bar)//bar is not defined
switch语句的代码也是块级作用域
var color = "red"
switch (color) {
case "red":
var foo = "foo"
let bar = "bar"
}
console.log(foo)//foo
console.log(bar)//bar is not defined
for语句的代码也是块级作用域
for (var i = 0; i < 10; i++) {
console.log("Hello World" + i)
}
console.log(i)
for (let i = 0; i < 10; i++) {
}
console.log(i)
例:
for (var i = 0; i < 4; i++) {
(function(n) {
console.log(i+"第" + n + "个按钮被点击")
})(i)
}
console.log(i)//4
for (let i = 0; i < 4; i++) {
console.log(i+"第" + i + "个按钮被点击")
}
console.log(i)//i is not defined