js中的作用域与变量声明提升?
js中的作用域与变量声明提升?
变量提升的表现是,无论我们在函数中何处位置声明的变量,好像都被提升到了函数的首部,我们可以在变量声明前访问到而不会报错。
造成变量声明提升的本质原因是 js 引擎在代码执行前有一个解析的过程,创建了执行上下文,初始化了一些代码执行时需要用到的对象。当我们访问一个变量时,我们会到当前执行上下文中的作用域链中去查找,而作用域链的首端指向的是当前执行上下文的变量对象,这个变量对象是执行上下文的一个属性,它包含了函数的形参、所有的函数和变量声明,这个对象的是在代码解析的时候创建的。这就是会出现变量声明提升的根本原因。
提升前:
console.log(foo) // undefined
var foo = '123'
bar() // 456
function bar() {
console.log('456')
}
zoo() // zoo is not a function
var zoo = function() {
console.log('789')
}
提升后:
var foo = undefined
var zoo = undefined
function bar() {
console.log('456')
}
console.log(foo) // undefined
foo = '123'
bar() // 456
zoo() // zoo is not a function
zoo = function() {
console.log('789')
}