卷耳

文章 评论 浏览 29

卷耳 2022-05-04 13:55:25

函数执行过程分为两步,创建执行环境和执行代码,创建执行环境的时候声明变量,在执行代码阶段给变量赋值。
本例中,函数内部使用var 声明了name,所以在创建执行环境时,函数声明了一个私有变量name,函数执行阶段,if中的name找到了私有变量name,此时没有赋值,所以走的是true的分支。

var name = 'Tom';
(function() {
    if (typeof name == 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

如果在函数内部的if语句中使用let 声明name,则在创建执行环境的时候不会声明内部变量name(if花括号中name被认为是if的局部变量),在执行代码阶段,找到了全局变量name(全局变量name已经赋值了),所以此时if判断走false分支。

var name = 'Tom';
(function() {
    if (typeof name == 'undefined') {
        let name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

如果在函数内部if语句之前使用let声明name,那么同情况一一样,也会在函数内部声明私有name。所以走true分支

var name = 'Tom';
(function() {
  let name
  if (typeof name == 'undefined') {
    console.log('Goodbye ' + name);
  } else {
    console.log('Hello ' + name);
  }
})();


第 108 题:请写出如下代码的打印结果

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文