js 变量提升与作用域链

今天看到的两道题,第一眼还被迷惑住了。

  1. 第一题:
var name = 'Tom';
(function(){
  if(typeof(name) == undefind){
    name = 'Jack';
    console.log('Goodbye ' + name);
  }else{
    console.log('Hello ' + name);
  }
})();

// 'Hello Tom'
  1. 第二题:
var name = 'Tom';
(function(){
  if(typeof(name) == undefind){
    var name = 'Jack';
    console.log('Goodbye ' + name);
  }else{
    console.log('Hello ' + name);
  }
})();

// 'Goodbye Jack'

typeof(name) 执行时,第一题中,函数作用域内找不到 name ,就会从作用域链寻找,便找到了 window 作用域下的 name ,所以 name 的值为 'Tom'。而在第二题中,函数作用域内 var name = 'Jack'; 会将name的声明提升到作用域上层,这时name还未赋值,所以name的值为undefind。

你可能感兴趣的:(js 变量提升与作用域链)