一道面试题告诉了我函数在块级作用域中的提升并没有那么简单,作为移动开发程序员应该怎样去规划自己的学习路线

36 阅读3分钟

foo = 1;

}

console.log(foo);

最终的打印结果是:ƒ foo() { } 所以你猜对了吗 [手动狗头]

1.1 题目1 解题思路

{

console.log(window.foo, foo) // undefined ƒ foo() { }

function foo() { }

console.log(window.foo, foo) // ƒ foo() { } ƒ foo() { }

foo = 1;

console.log(window.foo, foo) // ƒ foo() { } 1

}

console.log(foo); // ƒ foo() { }

没错,你没看错,就是粗暴的用 console 对此我只想说,没有什么事 console 解决不了 如果有,那就多写几个 [二次手动狗头]

  • 下边我们来一步一步分析

  • 第一行,打印 undefined ƒ foo() { } 说明此时,函数声明提升到了块级作用域顶部,但没有挂载到全局

  • 第二行,function foo() { } 实际执行时,会有一个隐式操作,将当前 foo 的值,同步给 window

  • 通过 第一行打印结果可以得出,此时 foo 为 ƒ foo() { }

  • 第三行,打印 ƒ foo() { } ƒ foo() { } 说明此时,函数已经被挂载到全局,且在第二行执行了上述的隐式操作

  • 第四行,foo = 1,此时修改的是 块内的 foo,与外部 window 无关

  • 第五行,打印 ƒ foo() { } 1 印证上一行言论

  • 最后一行,打印 ƒ foo() { }

2. 题目2


{

function foo() { }

foo = 1;

function foo() { }

}

console.log(foo);

最终的打印结果是:1 所以你又猜对了吗 [还是手动狗头]

2.1 题目2 解题思路

{

console.log(window.foo, foo) // undefined ƒ foo() { }

function foo() { }

console.log(window.foo, foo) // ƒ foo() { } ƒ foo() { }

foo = 1;

console.log(window.foo, foo) // ƒ foo() { } 1

function foo() { }

console.log(window.foo, foo) // 1 1

}

console.log(foo); // 1

没错 console.log YYDS [重复手动狗头]

  • 下边我们来一步一步分析

  • 第一行,打印 undefined ƒ foo() { } 说明此时,函数声明提升到了块级作用域顶部,但没有挂载到全局

  • 第二行,function foo() { } 实际执行时,会有一个隐式操作,将当前 foo 的值,同步给 window

  • 通过第一行打印结果可以得出,此时 foo 为 ƒ foo() { }

  • 第三行,打印 ƒ foo() { } ƒ foo() { } 说明此时,函数已经被挂载到全局,且在 第二行执行了上述的隐式操作

  • 第四行,foo = 1,此时修改的是,块内的 foo,与外部 window 无关

  • 第五行,打印 ƒ foo() { } 1 印证上一行言论

  • 第六行,function foo() { } 实际执行时,会有一个·隐式操作·,将当前 foo 的值,同步给 window

  • 通过第五行行打印结果可以得出,此时 foo 为 1

  • 第七行,打印 1 1

  • 最后一行,打印 1

3. 题目3


{

function foo() { }

foo = 1;

function foo() { }

foo = 2;

}

console.log(foo);

最终的打印结果是:1 所以你应该能猜对了吧 [强行手动狗头]

3.1 题目3 解题思路

{

总结

大厂面试问深度,小厂面试问广度,如果有同学想进大厂深造一定要有一个方向精通的惊艳到面试官,还要平时遇到问题后思考一下问题的本质,找方法解决是一个方面,看到问题本质是另一个方面。还有大家一定要有目标,我在很久之前就想着以后一定要去大厂,然后默默努力,每天看一些大佬们的文章,总是觉得只有再学深入一点才有机会,所以才有恒心一直学下去。

开源分享:docs.qq.com/doc/DSmRnRG…