Open yygmind opened 5 years ago
第一眼,差点去变量提升了。。。
var name = 'Tom'; (function() { if (typeof name == 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })();
hello Tom 1、首先在进入函数作用域当中,获取name属性 2、在当前作用域没有找到name 3、通过作用域链找到最外层,得到name属性 4、执行else的内容,得到Hello Tom
Hello Tom ,当前自执行函数的作用域找不到name ,会从作用域链寻找,上级作用域是window ,name的值是tom,所以走else分支
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
Hello Tom
(function())()直接触发 IIFE,函数内部没有name,直接从调用函数位置的作用域查找name。 打印: Hello Tom
Hello Tom 作用域链,在当前函数下没有找到name的定义,去window下面找,找到了name的定义,此时name不是undefined,所以执行console.log('Hello ' + name);
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
Hello Tom, 昨天那道题会做了,这道题自然也就会做了,考的一个概念。 这道题,没什么意思。 期待新题
JavaScript 在非严格模式下申明变量,可以不使用 var
(或 let
/ const
)关键字,这样申明的变量都会被提升到全局作用域中。当然,不使用 var
也就不存在变量提升的效果。
我觉得这道提估计想考这个知识点,但是题目没有设计得好。
这道题是匿名函数的自我执行与作用域的问题,当name找不到的时候,会往上找,一直找到window,所以输出结果是hello Tom
创建阶段 var name = undefined 匿名函数 执行阶段 name = 'Tom' // name已经初始化完成 匿名函数执行
var a = 'Tom' console.log(a) // Tom
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"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.
Hello Tom
结果为'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'
Hello Tom
Hello Tom 考察作用域
这个和运行环境也有关系吧,vscode 打印出的是goodBye Tom
(function() {
if (typeof name == 'undefined') {
name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})();
这个变体也很有意思啊,考的是window.name在浏览器是默认存在的= =