笔试中遇到的变量提升相关题目

135 阅读1分钟

第一题

var a = 1
function b() {
    a = 2
    console.log(a)
}
b()
console.log(a)

首先调用函数 b(),在函数内部将变量 a 的值改为 2,并打印出 a 的当前值,所以首先输出 2。 然后执行 console.log(a),此时全局变量 a 已经在函数 b() 中被修改为 2,因此再次输出 2。 综上所述,最终的输出结果是:2 2

第二题

var x = 10
3function changeValue() {
    var x = 20;
    console.log(x)
}
changeValue()
console.log(x)

原因在于 JavaScript 中函数内部的变量 x 是一个新的局部变量,它与全局变量 x 是不同的。因此,在函数内部打印的是局部变量 x 的值(即20),而在函数外部打印的是全局变量 x 的值(即10)。

第三题

var a = 1
function foo() {
    console.log(a)
    var a = 2
}
foo()
console.log(a)

首先调用函数 foo(),在函数内部尝试打印变量 a 的值。然而,在 JavaScript 中,由于变量声明提升 (hoisting),var a = 2 这一行虽然出现在 console.log(a) 之后,但在执行上下文创建阶段(即函 数调用前的准备阶段)会被提升到函数顶部,因此在执行 console.log(a) 时,变量 a 已经在当前作用 域中被声明但还未赋值,所以此时输出 undefined。 接下来,函数内给变量 a 赋值为 2,但这并不会影响到全局变量 a。 最后,执行 console.log(a),打印全局变量 a 的值,其值仍为初始定义的 1。 所以最终打印结果是 undefined 1

代码执行顺序:

var a = 1
function foo() {
    var a
    console.log(a)
    a = 2
}
foo()
console.log(a)