如果你认为自己了解 JavaScript,试试这些问题🙄

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

文章介绍了一些高级JavaScript面试问题,包括闭包、异步编程和事件循环等。闭包使函数可以访问外部函数的变量。通过`let`或IIFE解决`setTimeout`中的`var`作用域问题。解释了`call`、`apply`和`bind`的区别,并提供防抖函数、深拷贝对象和Promise.all的代码示例。还讨论了事件委托,通过父元素监听子元素事件,适用于动态元素。

🎯

关键要点

  • 闭包允许函数访问外部函数的变量,即使外部函数已经执行完毕。
  • 使用let或IIFE解决setTimeout中的var作用域问题。
  • setTimeout的输出顺序是1, 4, 3, 2,因setTimeout为异步操作。
  • 防抖函数确保在指定时间内只调用一次函数,适用于快速连续的操作。
  • call、apply和bind的区别在于参数传递方式和this上下文的设置。
  • 深度扁平化数组可以使用递归或ES6的flat方法。
  • 深拷贝对象需要递归复制每个属性,包括嵌套对象。
  • Promise.all接受一个Promise数组,返回一个新的Promise,所有Promise都解决时返回结果。
  • 事件委托是将事件监听器附加到父元素,通过事件冒泡监听子元素的事件。

延伸问答

闭包是什么,它有什么实际应用?

闭包允许函数访问外部函数的变量,即使外部函数已经执行完毕。实际应用包括数据隐私、函数工厂和柯里化。

如何解决setTimeout中的var作用域问题?

可以使用let声明变量,或使用立即调用函数表达式(IIFE)来创建一个新的作用域。

防抖函数的作用是什么,如何实现?

防抖函数确保在指定时间内只调用一次函数,适用于快速连续的操作。实现方法是使用setTimeout来延迟函数调用。

call、apply和bind有什么区别?

call和apply都用于设置函数的this上下文,call接受参数列表,而apply接受参数数组。bind返回一个新函数,this上下文固定。

如何深拷贝一个对象?

深拷贝需要递归复制每个属性,包括嵌套对象,可以通过遍历对象属性并递归调用深拷贝函数实现。

Promise.all的功能是什么,如何从零实现它?

Promise.all接受一个Promise数组,返回一个新的Promise,所有Promise都解决时返回结果。可以通过计数已完成的Promise来实现。

➡️

继续阅读