第 109 题:扩展题,请写出如下代码的打印结果
var name = 'Tom'; (function() { if (typeof name == 'undefined') { name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(25)
typeof name == 'undefined'首先会在IIFE作用域寻找变量name,未寻找到,会通过作用域链向上级作用域继续寻找,通过IIFE调用位置知道上级作用域为window
Hello Tom.函数内部没有,则继续往函数所在的作用域往上找,从调用函数位置的作用域查找name。
hello Tom
Hello Tom.
name = 'Jack';
相当于var name = 'Jack';
这样就是上题了Hello Tom,
昨天那道题会做了,这道题自然也就会做了,考的一个概念。
这道题,没什么意思。
期待新题
hello tom
Hello Tom
JavaScript 在非严格模式下申明变量,可以不使用
var
(或let
/const
)关键字,这样申明的变量都会被提升到全局作用域中。当然,不使用var
也就不存在变量提升的效果。我觉得这道提估计想考这个知识点,但是题目没有设计得好。
这道题是匿名函数的自我执行与作用域的问题,当name找不到的时候,会往上找,一直找到window,所以输出结果是
hello Tom
创建阶段
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
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
Hello Tom
Hello Tom
Hello Tom
考察作用域
这个和运行环境也有关系吧,vscode 打印出的是goodBye Tom
这个变体也很有意思啊,考的是window.name在浏览器是默认存在的= =
Hello Tom
作用域链,在当前函数下没有找到name的定义,去window下面找,找到了name的定义,此时name不是undefined,所以执行console.log('Hello ' + name);
(function())()直接触发 IIFE,函数内部没有name,直接从调用函数位置的作用域查找name。
打印: Hello Tom
Hello Tom
打印结果为:
// Tom
// Tom
// Hello Tom
因为一开始声明了name,在启用自执行函数后,会首先在自执行函数作用域内找name属性,好了,没有找到,接下来去外层找name,刚好外层声明了name属性,那就拿到
name='Tom'
属性,进入else,打印hello TomHello Tom ,当前自执行函数的作用域找不到name ,会从作用域链寻找,上级作用域是window ,name的值是tom,所以走else分支
hello Tom
1、首先在进入函数作用域当中,获取name属性
2、在当前作用域没有找到name
3、通过作用域链找到最外层,得到name属性
4、执行else的内容,得到Hello Tom
Hello Tom
第一眼,差点去变量提升了。。。
var name = 'Tom'; (function() { if (typeof name == 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();