for (var i=1; i=5; i++) {
设置超时(函数(){
控制台.log(i);
}, 1000);
}
那么经过你的分析,你认为这段代码会输出什么呢?
有的同学很果断,一眼就写出了答案:1、2、3、4、5
有的同学比较谨慎,分析后得出结论:5、5、5、5、5
有同学坚持实用主义,立即打开vscode再次运行代码,得到6,6,6,6,6
但我们现在面临的是面试问题。肯定不会有电脑给你运行代码,所以我们需要了解其机制和原理。
对不起拿到12345的同学,你还没有入门js,还需要继续努力。
结论是,55555名同学已经掌握了同步和异步机制,对变量作用域也有了很好的理解,但不够细心。
那为什么是66666呢?首先,变量i在这段代码中是一个“变量”,因为函数内部只有参数是常量。 For循环瞬间完成了循环,循环中变量i的值也在不断变化,五个定时器必须同时执行。此时i的值已经是6了,为什么是6呢?因为i++最后会再次执行,而i的起始值为1,犯错的同学明白了吗?
好吧,我们来看看什么是闭包。
首先问一个问题,我们如何修改上面的代码,使输出结果变成12345?
如果你是一个熟悉闭包的学生,将会给出以下结果。
for (var i=1; i=5; i++) {
(函数(j){
设置超时(函数(){
控制台.log(j);
}, 1000);
})(我);
}
首先,这里给新手同学延伸一个概念。 JavaScript 中“()”的用法。
()可以定义操作的优先级,这个大家都知道。那么()还有另一种用法,就是执行。所以当有两个()时,如果前面的()满足表达式规则,那么第一个()会作为函数执行,那么第二个())就是这个函数的参数。
正如前面提到的,只有函数的参数才是函数内部的常量。那么j是一个常数。这个常量就是循环调用这个函数时传入的i。循环执行了5次,i被传入了5次。定时器打印j的值,即每次传入的i的值。这称为闭包。
如果你还没有理解()的概念,也没有真正理解上面的代码,那么我们可以让代码更直观一些。
函数outnum (i) {
设置超时(函数(){
控制台.log(i);
}, 1000);
}
for (var i=1; i=5; i++) {
输出数(i);
}
这不是更好理解吗?
说到这里,我们再延伸一下另一个知识点,定时器。
for (var i=1; i=5; i++) {
设置超时(函数(){
控制台.log(i);
}, 1000);
}
控制台.log(i);
这段代码的输出结果是666666
在上面的代码中,我们假设当两个输出之间有第二个间隔时,它们之间用- 分隔。如果两个输出之间的间隔可以忽略,则它们之间用-分隔。你认为上面代码的输出会是什么?
正确答案是:6-6、6、6、6、6 为什么?这就需要非常熟悉JS中的定时器工作机制。在循环执行期间,几乎同时设置了5个定时器。正常情况下,这些定时器会在1秒后被触发,并立即执行循环后的输出
好了,文章到这里就结束啦,如果本次分享的深入探讨JavaScript核心面试题:闭包与变量作用域解析和问题对您有所帮助,还望关注下本站哦!
【深入探讨JavaScript核心面试题:闭包与变量作用域解析】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
最近准备面试,感觉这些东西都挺重要的!
有16位网友表示赞同!
闭包一直让我有点绕,希望这篇文章能解释清楚!
有18位网友表示赞同!
变量的作用域也是个很重要的话题,以前没太明白,好好学习一下吧。
有13位网友表示赞同!
面试真难啊,希望能通过这篇博客掌握这些知识点。
有11位网友表示赞同!
准备写代码还要注意作用域?感觉又加了难度!
有18位网友表示赞同!
我有些理解闭包的概念,但变量的作用域还是懵逼中...
有12位网友表示赞同!
JavaScript这门语言学习起来总是很费劲!
有11位网友表示赞同!
看来面试题真得要提前准备才行啊!
有19位网友表示赞同!
期待博客能深入浅出讲解这些概念!
有5位网友表示赞同!
闭包和作用域是JavaScript的基础知识,要好好掌握。
有5位网友表示赞同!
学习编程真的需要不断地总结和复习!
有8位网友表示赞同!
面试是一个很好的锻炼机会,要充分利用它!
有16位网友表示赞同!
分享好的资源总是很让人高兴的!感谢博主!
有20位网友表示赞同!
感觉JavaScript越来越复杂了...
有15位网友表示赞同!
学习编程是一场漫长的征程,希望自己能一直坚持下去!
有16位网友表示赞同!
最近也想学习闭包和作用域,来看看这篇博客了解一下。
有6位网友表示赞同!
看一篇好的博客能省下很多时间和精力!
有7位网友表示赞同!
学习的过程中总会有困惑的地方,希望能找到答案!
有8位网友表示赞同!
分享文章总是很乐意看到的!谢谢!
有19位网友表示赞同!
希望这篇博客能帮助我更好地理解JavaScript!
有5位网友表示赞同!