小元
博客
详情文字在这里缓缓展开
静候你翻开这一页

让人头疼的面试题-函数

让大部分人头疼的面试题也是错误率较高的面试提之“函数”

   前言:

       在面试中往往难倒你的可能不是一个算法难题,也不是关于Vue或React中的某个优化机制或生命周期?NONONO,它可能是一个JS的运行时行为,直接或间接的影响着实际项目中的性能表现或内存使用。


   问题:

       问在下方的代码中那种方法实现方式性能更好,为什么?

<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <button id="button">Click</button>
</body>
</html>

<script type="application/javascript">
  const btn = document.getElementById("button");
  const items = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
  
  // 方法 - A
  btn.addEventListener('click', () => {
    items.forEach(item => {
      console.log(item)
    })
  })
  
  // 方法 - B
  btn.addEventListener('click', function () {
    items.forEach(function (item) {
      console.log(item)
    })
  })
</script>

       大部分人可能会选择A,问为什么,理由通常大概是现代的编码习惯更简洁的语法,有的会进一步说明是现代游览器中JS对箭头函数做出了优化。

       当然上述都是错误的,正确的是方法B


   原因分析:

       问题不在语法简洁否而在于内存管理上,在方法A中,每次点击都会创建一个新的箭头函数,这是因为箭头函数会捕捉词法作用域的this,它们无法被removeEventListener正确移除


 词法作用域:

       词法作用域(Lexical Scope)是指变量的作用域是由代码在编写时的位置决定的,而不是由代码执行时的调用堆栈来决定的。也就是说,JavaScript 在执行代码时,根据函数的嵌套结构来决定哪些变量是可访问的。

渝ICP备2024031078号-1
本网站一切内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
如无意中侵犯了企业或个人的知识产权等,请及时通过电子邮件(1102905617@qq.com)告知我,本网站将会给予删除。
最新公告
😊访客你好,很高兴你的到来,本博客仍在建设中,还有些许功能尚在开发中,最后祝你在此能有所收获。
💥小元博客第三代自2025年9月上线以来,2026/08/09日迎来了它的第三次更新本次更新内容如下:
1. 文章详情页样式变更,由原来的弹窗改为单独的页面。
2. 使用Nuxt对项目进行了SEO优化,优化了搜索引擎的抓取和索引。
3. 对验签进行了优化,降低了请求被误触发拦截的概率。
4. 移动端也正在稳步推进中,在不久的将来会与大家见面。
5. 修复了首页黄历节日不显示的问题,以及其它bug的修复。