var 提升 问题

var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}

f(); // undefined
var tmp = new Date();

function f() {
  console.log(tmp);
 
}

f(); // Tue Feb 26 2019 17:41:29 GMT+0800 (中国标准时间)

这个明明if不会执行 相当于没有 为什么写不写 输出就不一样呢

阅读 2.6k
4 个回答

调用一个函数的过程中,执行上下文会被创建,生命周期会分为两个阶段,创建和执行。
创建阶段:执行上下文会分别创建变量对象,建立作用域链,以及确定this的指向。
执行阶段:会完成变量赋值,函数引用,以及执行其他代码。

也就是说在创建阶段如果找到一个变量声明,则会以变量名创建个属性,值为undefined。执行阶段才会被真正赋值。

来源: 前端基础进阶(三):变量对象详解

var tmp = new Date();

function f() {
  console.log(tmp);
  if (false) {
    var tmp = 'hello world';
  }
}

f(); // undefined


解析完顺序是这样的

var tmp = new Date();

function f() {
  var tmp;
  console.log(tmp);
  if (false) {
    tmp = 'hello world';
  }
}

f(); // undefined

var只有函数作用域,查询过程先看作用域内,如果没有继续往上找!

可以参考:https://segmentfault.com/a/11...

你都知道提升这个概念了,还不知道答案。提升发生在解析阶段,不管代码有没有执行到,提升都会发生

预编译了解下,预编译有个四部曲,看完你就明白了。

推荐问题
宣传栏