jirengu / frontend-interview

前端笔试面试题题库
1.29k stars 139 forks source link

JS声明前置相关问题 #13

Open jirengu opened 7 years ago

jirengu commented 7 years ago

以下代码会不会报错,如果不报错输出什么,为什么

    var y = 10;

    if (!(x in window)) {
        var x = 10;
    } else {
        ++y;
    }

    alert(x);
    alert(y);
VamKram commented 7 years ago

var x = 10; -> var x ; x = 10;

xcatliu commented 7 years ago
undefined
11

varif 里面,会提前到块级作用域的开始,相当于:

var x;
var y = 10;

if (!(x in window)) {
  x = 10;
} else {
  ++y;
}

alert(x);
alert(y);
hungeroxc commented 7 years ago

输出undefined和11,其中x的值为undefined,y的值为11。

原因:变量提升,对式子进行转换后得出:

 var y;
 var x;
 y = 10;
 if (!(x in window)) {
    x = 10;
 } else {
    ++y;
 }
alert(x);
alert(y);`

然后因为,此时的x在全局环境被声明,所以!(x in window)为false,不执行x的赋值,然后执行++y,得出y值为11,x值为undefined;

pingfengafei commented 7 years ago

因为js没有块级作用域,以及存在变量提升。 这里补充另一种情况:函数的变量提升:

foo(); // foo
bar(); //bar is not defined

function foo() {
  console.log('foo');
}

bar = function () {
  console.log('bar');
};
coolHt commented 7 years ago

学习到了。还以为没有满足条件var 不会声明提前了。get