if (1) {
// var变量声明预编译提升到上一层,或者说if没有块级
var val = 233
}
try {
console.log(val) // 233
} catch (error) {
console.error(error)
}
if (1) {
try {
console.log(_val) // 没有初始化,即暂定死区。改成var声明会输出undefined,var默认初始化为undefined
} catch (error) {
console.log(error)
}
// let块作用域
let _val = 344
}
try {
console.log(_val) // _val is not defined,因为_val在块作用域内(子作用域)
} catch (error) {
console.error(error)
}
// 函数作用域也是块级
function Block() {
// 函数封闭作用域
var _val_0 = 344
}
try {
console.log(_val_0) // _val_0 is not defined
} catch (error) {
console.error(error)
}
const People = (function() {
// iife闭包环境
// 被闭包的变量,所有实例共享
var _age = 21
function People(name) {
this.name = name
}
People.prototype.getAge = function() {
return _age
}
People.prototype.addAge = function() {
_age++
}
return People
})()
const me = new People("saber2pr")
me.addAge()
console.log(me.getAge()) // 22
const saber = new People("saber")
saber.addAge()
console.log(saber.getAge()) // 23
js 里存在 3 种作用域
- 全局作用域
- 函数作用域
- 对象作用域 每个作用域里的 var 声明都会提升到该作用域顶层 子作用域声明覆盖父作用域