函数如何访问自身?及内层函数自调用与作用域链的关系求证
函数自访问与作用域链相关问题解答
嘿,咱们来逐个拆解你的问题:
一、函数如何实现对自身的访问?
在JavaScript里,有几种常见的方式让函数能引用自身:
- 直接使用函数名称:这是最直观的方式,就像你示例里的
inner()一样。只要函数名在当前作用域可被访问,函数内部就能通过这个名称调用自己。 - 利用
arguments.callee(注意严格模式限制):在非严格模式下,函数内部的arguments.callee属性会指向当前正在执行的函数。比如:
function foo() { console.log(arguments.callee === foo); // 输出 true }
不过ES5的严格模式会禁用这个属性,所以现在更推荐用函数名或者命名函数表达式的方式。
- 命名函数表达式:如果是用函数表达式定义的函数,你可以给它加一个内部名称,这个名称只能在函数内部访问,用来引用自身:
const countDown = function loop(num) { if (num === 0) return; console.log(num); loop(num - 1); // 内部用loop引用自身 };
二、inner函数自调用是否依赖作用域链?
你的理解完全正确!咱们结合你给出的代码来看:
function outer() { function inner() { inner(); } }
当调用inner时,JS引擎会按照作用域链的规则从内到外查找标识符inner:
- 首先检查
inner自身的函数作用域,这里没有重新声明inner; - 接着向上查找外层的
outer函数作用域,而inner函数的声明正好存在于这个作用域里,于是找到了对应的函数引用,从而完成自调用。
本质上,函数能通过名称找到自身,就是依赖JS的作用域链查找机制——作用域链决定了标识符的查找顺序和可访问范围,所以inner能自调用确实是作用域链在起作用。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

