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。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容