最近看到一道某手机公司的校招前端笔试题,感觉很有意思。与大家分享一下
本文适合对于变量提升存疑的小伙伴们查看。

下列代码输出结果正确的是:()

var val = 12;
function fun1(){
   console. log(val);
   var val = 20;
   console.log(val);
}
fun1();

A.12 20

B.12 12

C.undefined 20

D.20 undefined

毫无疑问这道题涉及到了变量提升。答案的第二项是20应该是没有争议的,相当于

var val=20;
console.log(val);

定义一个变量,再输出。
就是答案的第一项对于那些不太熟悉变量提升的人们很容易就会选错,毕竟

 var val = 12;
 function fun1(){
   console.log(val);//12
 }
 fun1();

函数外部定义一个变量,函数内输出值,没什么问题。
那如果题目是这样呢:
var val = 12;
function fun1(){

console.log(val);//12
val = 20;
console.log(val);//20

}
fun1();

函数外部定义一个变量,函数内部先输出得12再重新进行赋值,再次输出得20。
那么我们回到一开始的题目。
题目是这样

下列代码输出结果正确的是:()

var val = 12;
function fun1(){
   console. log(val);//undefined
   var val = 20;
   console.log(val);//20
}
fun1();

和上面比,不同的地方在于函数内部输出过一次后又重新定义并赋值,虽然只是多了个val,但结果就不一样了,他影响着第一个val的输出值。
为什么第一个输出值为underfined,
其实上面的代码等同于var val = 12;

function fun1(){
   var val;
   console. log(val);//undefined
   val = 20;
   console.log(val);//20
}
fun1();

由于函数内重新定义val,导致变量val被提升到了顶端,但它被赋予的值并没有提升,所以第一个console.log(val)输出的只是定义过但没有被赋值的val,第二个console.log输出的是被赋值20的val。
所以这道题的答案为C。


overthes
10 声望2 粉丝

JavaScript从入门到关门