Advanced-Frontend / Daily-Interview-Question

我是依扬(木易杨),公众号「高级前端进阶」作者,每天搞定一道前端大厂面试题,祝大家天天进步,一年后会看到不一样的自己。
https://muyiy.cn/question/
27.44k stars 3.29k forks source link

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

Open yygmind opened 5 years ago

yygmind commented 5 years ago
var name = 'Tom';
(function() {
    if (typeof name == 'undefined') {
        name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();
zhushibo commented 5 years ago

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

ligoudan1 commented 5 years ago

Hello Tom

whyjxh commented 5 years ago

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

Anne-Tao commented 5 years ago

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

ligoudan1 commented 5 years ago
        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

feengqi commented 5 years ago

Hello Tom

ZTrainWilliams commented 5 years ago

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

luhaifeng666 commented 5 years ago

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

ghost2113 commented 5 years ago

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

superermiao commented 5 years ago

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

liangchaofei commented 5 years ago

hello Tom

habc0807 commented 5 years ago

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

xiaokeqi commented 5 years ago

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

Nina0408 commented 5 years ago

hello tom

jinjunss commented 5 years ago

Hello Tom

zaviertang commented 5 years ago

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

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

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

MissNanLan commented 5 years ago

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

ByeWord commented 5 years ago

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

kunogi commented 5 years ago

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

gspgsp commented 5 years ago

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

---原始邮件--- 发件人: "kunogi"notifications@github.com 发送时间: 2019年7月21日(星期日) 中午12:05 收件人: "Advanced-Frontend/Daily-Interview-Question"Daily-Interview-Question@noreply.github.com; 抄送: "撒哈拉里的一粒沙"1554680230@qq.com;"Comment"comment@noreply.github.com; 主题: 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.

lml28043 commented 5 years ago

Hello Tom

james9527 commented 5 years ago

结果为'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'
737 commented 5 years ago

Hello Tom

tiger5wang commented 5 years ago

Hello Tom 考察作用域

wangrui-leo commented 4 years ago

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

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

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