JS中有两种作用域 一个是全局作用域 一种是函数作用域
全局作用域声明的属性 哪里的可以访问
javascript">console.log(a) //undefind
var a = 0
vat b = 1
console.log(a) // 0
函数作用域中声明的属性只能在函数中访问(如果在外部访问就会爆错)
javascript">console.log(a) // Uncaught ReferenceError: a is not defined
function fun() {console.log(a) // undefindvar a = 0;console.log(a) // 0
}
关于JS中的变量提升
变量提升的概念值的是将变量的声明和方法的定义放到最上面,例如:
javascript">console.log(a, fun1, fun2) // undefind, function, undefindconst a = 0;function fun1() {console.log('fun1')
}var fun2 = function() {console.log('fun2')
}
上面的代码中,在代码中 a 定义之前就能够访问到 a ,但是输出的是undefind, 这是因为它只会将变量的定义进行提升,而赋值不会;fun1 是一个方法,会直接提升到最上面,所以能在最最上面输出,而fun2是一个变量,它和a一样只会将定义提升;
特殊的let 和 const
虽然这两个也存在变量提升,但是提升之后并不能直接访问 ,会存在暂时性死区
javascript">console.log(a) // ReferenceError: Cannot access 'a' before initialization
let a = 1;
const b = 2;