首页 > 试题广场 >

请问函数test最终输出的值是多少? var a = 1;

[单选题]
请问函数test最终输出的值是多少?
var a = 1;
function test() {
    console.log(a);
    if(false) {
        var a = 2;
    }
}
test();


  • 1
  • 2
  • undefined
  • null
感觉现在var存在的意义就是出题目来折磨人,实际使用又没用
发表于 2021-12-16 17:28:17 回复(3)
函数会先去找自己内部的变量,内部有就不会往外面找,内部没有才去外面找
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();



发表于 2022-01-13 15:04:20 回复(4)
很简单,第一个考察点是作用域链,局部内能找到变量就用局部的,找不到才去外面找。
第二点,var不存在暂时性死区,所以会变量提升,但if(false){}永远不会执行,所以为undefined
发表于 2021-12-10 20:09:29 回复(0)
函数内部变量提升,因为test函数内部var a函数提升且默认值为undefined,优先查找使用函数内的a,判断不成立,2未成功赋值给a,所以输入undefined
发表于 2022-08-13 22:25:35 回复(0)
忘了 var 是函数作用域,所以会变量提升到 输出 a 语句之前
发表于 2021-12-14 09:00:51 回复(0)

var 声明变量的特点:没有块级作用域、存在变量提升

  1. 没有块级作用域,使 var 声明的变量在 if 语句外可以被访问
  2. 存在变量提升,使 var 声明的变量提升到当前作用域的顶部,即 test 函数内的顶部
  • 在 test 函数作用域中,局部变量 a 覆盖了全局变量 a
  • 变量提升只提升声明而不提升赋值,故此时 a 的值为 undefined,随后打印输出
发表于 2022-08-07 10:11:06 回复(0)
块域 var 变量也提升
发表于 2022-05-17 01:04:11 回复(0)
test最终输出多少是什么意思,里面不久一个控制台输出吗,控制台输出为1,undefinde是哪里来的
发表于 2022-01-10 01:42:56 回复(2)
var 变量提升不受块级作用域影响
编辑于 2024-02-26 20:29:29 回复(0)
这段代码会在控制台中打印出 `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` 的变量,所以函数会找到并使用它。

发表于 2023-10-09 11:17:15 回复(0)
test函数内,var定义的a变量提升至函数顶部,于是打印出undefined
发表于 2023-09-19 19:32:23 回复(0)
如果没有if判断 那输出应该是1?
发表于 2023-05-17 12:38:36 回复(0)
函数的声明比变量的声明还要前,所以会提升函数到最前面,这个时候a还未定义,所以为undefine
发表于 2022-11-07 22:28:36 回复(0)
var的变量等级提升,在打印a之前,var a; var声明的变量可以重复声明,故可以打印a,为undefined
发表于 2022-08-31 16:51:26 回复(0)
Javascript分为预处理阶段和执行阶段,尽管if里面的语句不会被执行,但是在预处理阶段还是会将其提升,因此最终还是undefined。

发表于 2022-07-22 17:13:10 回复(0)
变量提升变量提升变量提升,,代码执行前的预处理阶段会进行变量提升。这个时候要是还要走判断啥的相当于运行一遍程序了,所以预处理阶段不管代码逻辑是啥,变量都要提升上去
发表于 2022-04-26 11:35:45 回复(0)
// 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();


发表于 2022-04-20 21:31:14 回复(0)
在test函数作用域中,在编译阶段由于if条件中声明变量使用的是var关键字,会发生变量提升,var a = undefined;会提升到最前面,因此打印输出为undefined
发表于 2022-03-19 01:19:31 回复(2)
考察了预编译的过程,预编译阶段var a会提升在函数顶端,AO里面有变量a,值为undefined,不会去GO里面查找,所以打印undefined
发表于 2022-01-13 17:46:22 回复(0)