请问函数test最终输出的值是多少?
var a = 1; function test() { console.log(a); if(false) { var a = 2; } } test();
var a = 1; function test() { console.log(a); if(false) { var a = 2; } } test(); //其实代码执行过程如下: var a ; a = 1; function test() { //函数会先去找自己内部的变量,内部有就不会往外面找,内部没有才去外面找 var a; //变量提升 console.log(a); if(false) { //因为false没有满足if的条件,所以不能进入if语句里进行赋值 a = 2; //if语句的条件把false改成true,就可以进入if语句赋值 } } test();
这段代码会在控制台中打印出 `undefined`。 原因是 JavaScript 中的 `var` 声明会被提升(hoisted)到它们所在的作用域的顶部。 这意味着在函数或者代码块内部用 `var` 声明的变量,其声明部分会被提升到函数或者代码块的开始处,但赋值部分会保留在原地。 所以,你的代码实际上相当于: ```javascript var a = 1; function test() { var a; // a 被提升,此时 a 是 undefined console.log(a); // 打印 undefined if(false) { a = 2; // 这行代码永远不会执行 } } test(); ``` 所以,当你调用 `test()` 函数时,它会打印出 `undefined`。 如果你希望在 `test` 函数中访问全局变量 `a`,你可以不在函数内部声明 `a`(即if判断内部删除var)。 这样,函数就会沿着作用域链向上查找,直到找到名为 `a` 的变量为止。 如果在全局作用域中也没有找到 `a`,那么 `a` 就是 `undefined`。 但是在你的代码中,全局作用域有一个名为 `a` 的变量,所以函数会找到并使用它。
// var 定义的变量有多个性质 // (变量提升、变量提升造成的变量覆盖问题、可重复定义、全局定义的 var 变量会成为 windows 属性), // 比如这道题考察 var 的变量提升 // 原来的代码经过预编译可以理解成下面的样子 var a = 1; function test() { var a // 提升的变量会覆盖外面的 a console.log(a); // 此时打印的 a 变量是 undefined if (false) { // 这里原来是 var a = 2,虽然 if 里面不执行 但是预编译还是会提升 var a a = 2; } } test();