第 109 题:扩展题,请写出如下代码的打印结果

发布于 2022-09-02 11:58:35 字数 214 浏览 115 评论 25

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(25

如梦. 2022-05-04 13:55:24

typeof name == 'undefined'首先会在IIFE作用域寻找变量name,未寻找到,会通过作用域链向上级作用域继续寻找,通过IIFE调用位置知道上级作用域为window

饮湿 2022-05-04 13:55:24

Hello Tom.函数内部没有,则继续往函数所在的作用域往上找,从调用函数位置的作用域查找name。

暖伴 2022-05-04 13:55:24

hello Tom

初相遇 2022-05-04 13:55:24

Hello Tom. name = 'Jack'; 相当于 var name = 'Jack'; 这样就是上题了

萌化 2022-05-04 13:55:24

Hello Tom,
昨天那道题会做了,这道题自然也就会做了,考的一个概念。
这道题,没什么意思。
期待新题

你列表最软的妹. 2022-05-04 13:55:24

hello tom

三五鸿雁 2022-05-04 13:55:24

Hello Tom

So要识趣 2022-05-04 13:55:24

Hello Tom,
昨天那道题会做了,这道题自然也就会做了,考的一个概念。
这道题,没什么意思。
期待新题

JavaScript 在非严格模式下申明变量,可以不使用 var(或 let / const)关键字,这样申明的变量都会被提升到全局作用域中。当然,不使用 var 也就不存在变量提升的效果。

我觉得这道提估计想考这个知识点,但是题目没有设计得好。

度的依靠╰つ 2022-05-04 13:55:24

这道题是匿名函数的自我执行与作用域的问题,当name找不到的时候,会往上找,一直找到window,所以输出结果是hello Tom

伴梦长久 2022-05-04 13:55:24

创建阶段
var name = undefined
匿名函数
执行阶段
name = 'Tom' // name已经初始化完成
匿名函数执行

常见的例子:
console.log(a)
var a = 'Tom'
创建阶段:
var a = undefined
执行阶段
console.log(a) // undefined
a = 'Tom'

var a = 'Tom'
console.log(a) // Tom

回忆躺在深渊里 2022-05-04 13:55:24

var name = 'Tom';
(function() {
if (typeof name == 'undefined') {//找到window中的name,即首行的Tom,所以这里typeof得到string
name = 'Jack';//结合昨天的108题更好的理解#190
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();

//output:
Hello Tom

江挽川 2022-05-04 13:55:24

Hello Tom

渡你暖光 2022-05-04 13:55:24

结果为'Hello Tom' 分析:执行到typeof name时,函数体内没有name变量声明,就往上找,找到window全局有name变量且有赋值,因此typeof name不为undefined。

var name = 'Tom';
console.log(name) // 'Tom'
(function() {
    if (typeof name == 'undefined') {
        name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name); // 'Hello Tom'
    }
})();
console.log(name) // 'Tom'
紫瑟鸿黎 2022-05-04 13:55:24

Hello Tom

述情 2022-05-04 13:55:24

Hello Tom
考察作用域

青衫负雪 2022-05-04 13:55:24

这个和运行环境也有关系吧,vscode 打印出的是goodBye Tom

野却迷人 2022-05-04 13:55:24
(function() {
if (typeof name == 'undefined') {
  name = 'Jack';
  console.log('Goodbye ' + name);
} else {
  console.log('Hello ' + name);
}
})();

这个变体也很有意思啊,考的是window.name在浏览器是默认存在的= =

雨后彩虹 2022-05-04 13:55:21

Hello Tom
作用域链,在当前函数下没有找到name的定义,去window下面找,找到了name的定义,此时name不是undefined,所以执行console.log('Hello ' + name);

月光色 2022-05-04 13:55:19

(function())()直接触发 IIFE,函数内部没有name,直接从调用函数位置的作用域查找name。
打印: Hello Tom

我很坚强 2022-05-04 13:55:16

Hello Tom

楠木可依 2022-05-04 13:51:30
        var name = 'Tom';
        console.log(name);
        
        (function () {
            console.log(name);
            if (typeof name == 'undefined') {
                name = 'Jack';
                console.log('Goodbye ' + name);
            } else {
                console.log('Hello ' + name);
            }
        })();

打印结果为:
// Tom
// Tom
// Hello Tom
因为一开始声明了name,在启用自执行函数后,会首先在自执行函数作用域内找name属性,好了,没有找到,接下来去外层找name,刚好外层声明了name属性,那就拿到name='Tom'属性,进入else,打印hello Tom

一个人练习一个人 2022-05-04 13:05:34

Hello Tom ,当前自执行函数的作用域找不到name ,会从作用域链寻找,上级作用域是window ,name的值是tom,所以走else分支

╮执着的年纪 2022-05-04 11:29:22

hello Tom
1、首先在进入函数作用域当中,获取name属性
2、在当前作用域没有找到name
3、通过作用域链找到最外层,得到name属性
4、执行else的内容,得到Hello Tom

瀟灑尐姊 2022-05-04 06:40:20

Hello Tom

万水千山粽是情ミ 2022-05-04 05:00:26

第一眼,差点去变量提升了。。。
var name = 'Tom'; (function() { if (typeof name == 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();

~没有更多了~

关于作者

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

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