【前言】
本文谈下常见的一道JS面试题,let声明变量与var的区别,块级作用域等
【主体】
篇幅问题,部分放到文章JS中的let和var的区别里。
(1)面试题:接下来看到面试题
编写一个函数,该函数将遍历整数列表,并在延迟3秒后打印每个元素的索引
(2)错误写法:经常错误写法是这样的:
const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(function() { console.log('The index of this number is: ' + i); }, 3000); }
如果运行上面代码,3 秒延迟后你会看到,实际上每次打印输出是 4,而不是期望的 0,1,2,3 。
为了正确理解为什么会发生这种情况,了解为什么会在 JavaScript 中发生这种情况将非常有用,这正是面试官试图测试的内容。
(3)原因解析:
原因是因为 setTimeout 函数创建了一个可以访问其外部作用域的函数(闭包),该作用域是包含索引 i 的循环。 经过 3 秒后,执行该函数并打印出 i 的值,该值在循环结束时为 4,因为它循环经过0,1,2,3,4并且循环最终停止在 4。
(4)解决方案
1、解决方案有很多种,最简单的一种就是用let方法(将上面的var改为let即可)
const arr = [10, 12, 15, 21]; for (let i = 0; i < arr.length; i++) { setTimeout(function() { console.log('The index of this number is: ' + i); }, 3000); }
原因:ES6可以用let定义块级作用域变量,稍后详解
2、闭包
const arr = [10, 12, 15, 21]; for (var i = 0; i < arr.length; i++) { setTimeout(function(i_local){ return function () { console.log('The index of this number is: ' + i_local); } }(i), 3000) }
(5)拓展:块级作用域
详情看文章浅谈JS块级作用域
.
相关推荐
前端大厂最新面试题-var_let_const.docx
本人最近去面试出的面试题, 考的知识点有 async , await ,Promise ,let , var ,const ,call ,JSON 等
<h1>js基础面试题 <h2>1、js 的类型 1.认识js的基本类型 > typeof undefined, //undefined typeof 'abc' ,//string typeof 123 ,//number typeof true ,//boolean typeof {} ,//object typeof [] ,//object typeof ...
常见的英文面试题 Sample excellent response: My background to date has been centered around preparing myself to become the very best financial consultant I can become. Let me tell you specifically how ...
js常见面试题汇总 1.js的数据类型 2.双等和三等的区别 3.js中布尔值为false的六种情况 4.let const var 区别 5.普通函数和箭头函数的区别 6.数组有哪些方法 7.map()对比forEach() 8.for in 对比 for of区别 ...
都是传智播客收集的面试题希望对面有用 1、HTTP请求的过程 2、那说说数据库连接池的原理 3、Java的内存管理机制是什么 4、Javascript中怎么实现继承?有几种方式? 5、spring底层用什么实现? 6、hibernate和...
Rust常用面试题 复制和克隆的区别?要实现复制,必须先实现克隆复制表示这个struct可以以类似与memcpy的方式 一个自定义结构,必须所有元素都是复制,整个结构才能复制`let a =&* t`是什么意思? `&* t`表示对t解...
css的重绘与回流, 箭头函数和普通函数的区别是什么?,let、var、const的区别,实现一个new的伪代码,原型、原型链
阿里巴巴面试题leetcode 优秀连接 JavaScript刷题网站 练习英语 提问网站 牛客网 js刷题 JavaScript设计模式 阿里巴巴UED JSON数据解析 JavaScript 知识点 new关键字与构造函数 2017/2/2 ...
文档包含一些LTE网络常见的优化试题,对LTE考试认证非常有帮助
JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质。浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作。JS有一些概念,人们往往会对它掉以轻心,有时可能会忽略不计...问题2:如果我们使用 let
这几天逛CSDN论坛,发现在一些前端模块发的问题大都是因为var、let和const搞不清楚导致的,今天我来浅析下,希望对看到这篇博客的童鞋有所帮助~ What we know is that…(英语作文万能开头) :在JavaScript中有三种...
JavaScript通过对数据进行数据转换实现二叉树。数据结构如下:let data = [ { id: 1, name: "目录1", parentId: 0, }, { id: 2, name: "目录1-1", parentId: 1, }]
js代码-蚂蚁金服前端面试题 /* 题目 3: 模版替换引擎函数,根据模版字符串和传入的数据返回替换后的字符串,形如(template, data) => string, 具备一定的扩展性 参数: template: 模版字符串,例如 "My name...
前端面试题汇总汇总一些前端常见的面试题,大多数没有标准答案, 不同的人可能有不同深度的回答。同时,这些问题也可以用来检验自己的前端技术水平。(很多问题还是挺考验水平的。)建议不要背答案,而是尽可能地...
涉及到的 Java 知识非常齐全,主要有基础类、集合类、并发集合类、队列、线程、锁、线程池、Lambda 流等内容,内容几乎涵盖了工作和面试的核心,如果你对这些源码都了如指掌,面试题再千变万化,你也能应对自如。
本文针对目前常见的面试题,仅提供了相应的核心原理及思路,部分边界细节未处理。后续会持续更新,希望对你有所帮助。 1. 实现一个call函数 // 思路:将要改变this指向的方法挂到目标this上执行并返回 Function....
工作日每天一道大厂前端面试题,一年后再回头,会感谢曾经努力的自己!推荐扫码使用微信小程序,除了本项目之外,还囊括了算法题,选择题等多种类型变量和详细解析记住我们的口号:上下班路上刷一点,半年突击进大厂...
内功概要:前端面试-es6的相关面试题(问题+答案) 1、 ES6常用语法有哪些? 【参考答案】 ① Let: a.let定义的变量,变量不可以再次定义,但可以改变其值 b.具有块级作用域,只作用于使用了 let命令的代码块 c....
let obj = {}; let arr = []; console.log(typeof obj === 'object'); //true console.log(typeof arr === 'object'); //true console.log(typeof null === 'object'); //true 从上面的输出结果可知,typeof bar ==...