Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

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

Open yygmind opened this issue 4 years ago • 26 comments

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

yygmind avatar Jul 19 '19 00:07 yygmind

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

zhushibo avatar Jul 19 '19 01:07 zhushibo

Hello Tom

ligoudan1 avatar Jul 19 '19 01:07 ligoudan1

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

whyjxh avatar Jul 19 '19 01:07 whyjxh

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

Anne-Tao avatar Jul 19 '19 01:07 Anne-Tao

        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

ligoudan1 avatar Jul 19 '19 01:07 ligoudan1

Hello Tom

feengqi avatar Jul 19 '19 01:07 feengqi

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

ZTrainWilliams avatar Jul 19 '19 01:07 ZTrainWilliams

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

luhaifeng666 avatar Jul 19 '19 01:07 luhaifeng666

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

ghost2113 avatar Jul 19 '19 01:07 ghost2113

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

superermiao avatar Jul 19 '19 01:07 superermiao

hello Tom

liangchaofei avatar Jul 19 '19 02:07 liangchaofei

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

habc0807 avatar Jul 19 '19 02:07 habc0807

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

xiaokeqi avatar Jul 19 '19 02:07 xiaokeqi

hello tom

Nina0408 avatar Jul 19 '19 03:07 Nina0408

Hello Tom

jinjunss avatar Jul 19 '19 05:07 jinjunss

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

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

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

zaviertang avatar Jul 19 '19 15:07 zaviertang

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

MissNanLan avatar Jul 20 '19 03:07 MissNanLan

创建阶段 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

ByeWord avatar Jul 20 '19 13:07 ByeWord

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

//output: Hello Tom

kunogi avatar Jul 21 '19 04:07 kunogi

运行一下看看吧,就知道结果了

---原始邮件--- 发件人: "kunogi"[email protected] 发送时间: 2019年7月21日(星期日) 中午12:05 收件人: "Advanced-Frontend/Daily-Interview-Question"[email protected]; 抄送: "撒哈拉里的一粒沙"[email protected];"Comment"[email protected]; 主题: Re: [Advanced-Frontend/Daily-Interview-Question] 第 109 题:扩展题,请写出如下代码的打印结果 (#198)

var name = 'Tom'; (function() { if (typeof name == 'undefined') {//找到window中的name,即首行的Tome,所以这里typeof得到string name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();

//output: Hello Tom

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.

gspgsp avatar Jul 21 '19 04:07 gspgsp

Hello Tom

lml28043 avatar Jul 22 '19 02:07 lml28043

结果为'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'

james9527 avatar Jul 23 '19 02:07 james9527

Hello Tom

737 avatar Jul 29 '19 09:07 737

Hello Tom 考察作用域

tiger5wang avatar Jul 31 '19 01:07 tiger5wang

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

wangrui-leo avatar May 28 '20 03:05 wangrui-leo

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

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

miniflycn avatar Apr 04 '22 16:04 miniflycn