2019-01-19
问题
下列代码会输出什么?
var foo = 1
var foobar = () => {
console.log(foo)
var foo = 2
}
foobar()
回答
由于变量提升(Hoisting),局部变量 foo
将会在调用 console.log
方法之前进行声明。也就是说,作为参数传递给 console.log()
的局部变量 foo
替代了在函数外部声明的全局变量。但是变量初始化(赋值)并不会被提升,因此输出为 undefined
,而不是 2
。
加分回答
- JavaScript 只会将声明提升,初始化并不会被提升
- 提升指变量和函数声明在编译阶段被放入内存中,在代码中的位置并不会变动
- ES6 中的
let
、const
不存在提升
const foobar = () => {
console.log(foo)
let foo = 2
}
foobar() // Uncaught ReferenceError: foo is not defined