在严格模式下为什么不能访问 arguments.callee?还有别的替代方案?
围绕“在严格模式下为什么不能访问 arguments.callee?还有别的替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明让递归具名与性能原因,并给出命名函数表达式或默认参数替代。
JavaScript · 函数与作用域面试题第 1 页,显示第 1–39 题,共找到 39 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
围绕“在严格模式下为什么不能访问 arguments.callee?还有别的替代方案”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明让递归具名与性能原因,并给出命名函数表达式或默认参数替代。
讲解 arguments 转数组的三种方法及差异:slice.call 兼容性最好、Array.from 语义清晰、展开运算符最简洁,并说明箭头函数无 arguments、剩余参数可替代。
本文解释 arguments 与命名函数参数的根本不同:arguments 保存全部实参、是类数组但不继承 Array 方法,以及实参与形参在普通、严格和默认参数下的同步规则,并给出判断边界。
本题解释箭头函数为何无自身 arguments,基于词法作用域机制;说明可通过外层作用域引用取得外层函数的 arguments,并推荐剩余参数作为更清晰的替代方案,同时指出全局作用域下 arguments 不存在的边界。
本文解释箭头函数 this 的词法绑定机制:没有自身 this、继承外层函数、call/apply/bind 无效,并给出场景与边界。
围绕“异步生成器(async generator)与普通生成器有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 next() 返回 Promise,可 await 异步操作。
讲解 Function.prototype.bind 与 call/apply 的本质差异:bind 创建永久绑定 this 的新函数并支持预置参数,call/apply 为单次调用指定 this。结合 setTimeout、构造函数等场景说明边界。
围绕“JavaScript 函数参数是按值传递还是按引用传递?对象作为参数时表现如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释按值传递但引用类型传的是引用副本,修改属性会影响原对象,而重新赋值不影响。
围绕“将对象方法作为回调函数传入 setTimeout 时,为什么 this 会丢失?如何解决”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释引用传递时 this 变为全局,并给出 bind 或箭头函数解决方案。
围绕“为什么用 var 声明的循环变量在异步回调中会得到最终值?如何修复”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 var 函数作用域共享,以及用 let 或 IIFE 创建每层作用域。
围绕“闭包是如何导致内存泄漏的?如何避免”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明闭包长存引用导致被引变量无法回收,并提供改进如及时置 null。
围绕“用闭包实现柯里化(currying)的基本原理是什么?给出简单实现”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需利用闭包收集参数、返回新函数,直到参数足够。
本题考查 JavaScript 默认参数的求值时机:每次调用时才计算、从左到右初始化、可引用前面参数,但无法访问函数体内部变量,并解释参数作用域与暂时性死区的关系。
围绕“函数声明与函数表达式在作用域和提升上有何区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明声明整体提升、表达式仅变量提升,以及命名函数表达式的名称作用域。
围绕“所有函数都有 prototype 属性吗?箭头函数为什么没有”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明普通函数有 prototype,箭头函数和异步生成器没有等,不可用 new。
围绕“JavaScript 生成器函数(generator)是如何工作的?yield 与 next 的关系”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕必须描述生成器函数返回可迭代迭代器、yield 暂停恢复、next 返回数据结构。
围绕“生成器产生的对象与普通可迭代对象有何异同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明生成器对象本身即迭代器、实现 next/return/throw。
围绕“生成器函数能通过 new 调用吗?为什么?new.target 在其中是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明生成器函数不是构造函数,new 会报错,并提及不能绑定 this 等。
围绕“如何从外部停止一个生成器或向其中抛出异常”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释调用 generator.return() 和 generator.throw() 的行为与区别。
围绕“在生成器中,yield 与 return 有何本质区别?且 return 后还能继续 next 吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 yield 产生值并保持状态,return 结束生成器,后续 next 为 done: true。
围绕“函数内变量提升(hoisting)对 var 和 let/const 有何区别?能否在声明前访问”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 var 提升为 undefined,let 存在暂时性死区。
围绕“什么是立即执行函数表达式(IIFE)?它的主要用途有哪些”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释语法与创建新作用域、隔离变量、配合闭包保存状态等用途。
围绕“使用箭头函数写 IIFE 与普通函数 IIFE 有何本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖主要区别在于 this 的词法绑定,以及 arguments、new.target 等差异。
围绕“函数 length 属性代表什么?默认参数和剩余参数如何影响它”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 length 是形参个数但不包括默认参数/剩余参数之前的?实际规则。
围绕“JavaScript 词法作用域是如何工作的?作用域链如何形成”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释作用域在代码书写时决定,并递归关联外层函数。
围绕“函数对象的 name 属性是如何推断的?箭头函数与匿名函数呢”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明变量赋值、对象属性、默认参数等推断规则,以及箭头函数。
本文解释了 new 调用函数时内部发生的四步流程:创建空对象、原型关联、绑定 this、处理返回值。同时讨论 new.target 的检测、显式返回对象的覆盖情况,以及类与构造函数的差异。
围绕“new.target 在函数中表示什么?箭头函数中如何影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释它是构造函数是否为 new 的标志,在箭头函数中继承外层。
围绕“对象方法简写(method shorthand)与属性值为普通函数有何区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释简写方法使用 function 关键字,但不绑定自己的 arguments 或 super?严格来说简写方法不可作为构造函数,且。
围绕“可选链(?.) 如何用于函数调用?它对 this 绑定有何影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明如果调用不存在不会报错,且 this 绑定保持原引用。
围绕“如何利用闭包实现 JavaScript 的私有变量?有哪些模式”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需展示通过在函数内定义变量并返回暴露接口的方式。
对比剩余参数与 arguments 的核心差异:真数组 Vs 类数组、收集范围、同步机制、默认参数关系,并指出工程中的选择依据。
围绕“函数调用中副作用指什么?纯函数有什么特点”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需明确副作用定义与纯函数可预测性。
围绕“函数默认参数与块级作用域中的暂时性死区有什么关系”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明默认参数有自己的作用域,未初始化前访问外层同名变量可能导致 TDZ 错误。
本文解析 this 四种绑定规则及优先级,强调调用点决定 this,不扩展到箭头函数。内容含作用域机制、典型场景、边界条件,并提供判断方法。
围绕“在 class 中的方法 this 绑定与普通对象方法有何不同?为何通常要 bind”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明类方法默认不绑定,析构时 this 丢失,以及通过构造函数绑定或箭头字段初始化。
解释 addEventListener 回调中 this 的指向规则:普通函数 this 为 currentTarget 元素,箭头函数继承外层 this,并提供判断方法和适用场景。
围绕“var、let 和 const 在函数作用域与块级作用域上有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需比较函数作用域与块级作用域、变量提升与暂时性死区,直接与词法绑定相关。
围绕“yield* 表达式用于什么?如何在生成器中委托给另一个可迭代对象”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明委托迭代,最终值由 return 传递。