JavaScript嵌套函数示例中值的传递机制是怎样的?
JavaScript嵌套函数的值传递机制详解
嘿,很高兴你已经摸到嵌套函数和闭包的门道了!咱们直接用实打实的例子拆解值传递的具体逻辑,这样比干巴巴讲概念清楚多了。
先看一个基础嵌套函数示例
先写一段典型代码,咱们一步步拆:
function outerFunc(outerParam) { const outerVar = "我是外部函数的变量"; function innerFunc(innerParam) { const innerVar = "我是内部函数的变量"; console.log(outerParam); // 能访问外部参数 console.log(outerVar); // 能访问外部变量 console.log(innerParam); // 能访问内部参数 console.log(innerVar); // 能访问内部变量 } innerFunc("内部函数的参数"); } outerFunc("外部函数的参数");
第一步:外部函数调用时的参数传递
当你执行outerFunc("外部函数的参数")时:
- 字符串
"外部函数的参数"作为值传递给outerParam参数——JS里基本类型(字符串、数字、布尔)都是值传递,outerParam拿到的是这个值的副本。 - 同时外部函数内部创建了
outerVar变量,它的作用域被牢牢限定在outerFunc内部,外面的代码碰不到它。
第二步:内部函数调用时的参数传递
外部函数里调用innerFunc("内部函数的参数")时:
- 同样,这个字符串值被传递给
innerParam,innerParam拿到的也是值的副本。 - 内部函数自己创建的
innerVar,作用域只在innerFunc里,外部函数完全访问不到——这就是你说的“内部函数对外部私有”。
重点:闭包带来的特殊值绑定
这部分是最容易懵的地方,咱们用计数器例子来解释:
function createCounter() { let count = 0; return function() { count++; return count; }; } const counter = createCounter(); console.log(counter()); // 输出1 console.log(counter()); // 输出2
这里的核心逻辑:
- 当
createCounter()执行完后,它的执行上下文本来应该被JS引擎销毁,但因为返回的内部函数(也就是闭包)还持有对count的引用,所以count不会被垃圾回收机制清理。 - 每次调用
counter()时,内部函数都会直接修改外部函数作用域里的那个count变量本身,而不是它的副本——这就是闭包的魔力:内部函数能“记住”外部函数的变量状态,哪怕外部函数已经执行完毕。
补充:基本类型 vs 引用类型的传递差异
JS里引用类型(对象、数组)的传递规则有点特殊,是传递引用的副本,咱们看例子:
function outer(obj) { function inner() { obj.name = "修改后的名字"; } inner(); } const myObj = { name: "初始名字" }; outer(myObj); console.log(myObj.name); // 输出"修改后的名字"
解释一下:
- 调用
outer(myObj)时,传递的是myObj引用的副本,内部函数inner通过这个引用修改了原对象的属性,所以外部能看到变化。 - 但如果内部函数里写
obj = { name: "全新对象" },那只会修改内部的引用副本,不会影响外部的myObj——因为这是给内部的obj变量重新赋值了一个新的引用,和外部的myObj没关系了。
总结一下
嵌套函数的值传递遵循JS的基本规则:
- 基本类型传值的副本,引用类型传引用的副本;
- 闭包让内部函数能持续访问外部函数的变量/参数,哪怕外部函数已经执行完;
- 内部函数的变量/参数对外部完全私有,外部函数碰不到。
内容的提问来源于stack exchange,提问作者spiderman
相关产品推荐
相关产品推荐

