第一题
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)