You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该JavaScript函数生成此输出?obj1.myA值不变的原因是什么?

嘿,我来帮你把这几个问题掰扯清楚~

你的JavaScript工厂函数疑问详解

1. 为什么调用MyObject1(1,2)会生成{myA: 1, myB: 2, hello: ƒ}?

你写的MyObject1本质上是一个工厂函数——它的核心作用就是创建并返回一个新对象。当你调用MyObject1(1,2)时:

  • 函数的参数a被赋值为1,b被赋值为2
  • 函数内部直接返回了一个对象字面量,这个对象里的myA直接取了参数a的值,myB取了参数b的值,hello则是一个预先定义好的函数
  • 所以最终obj1就被赋值成了这个包含三个属性的对象,其中hello属性存储的是那个函数的引用,在控制台里会显示为ƒ(函数的简写标识)

2. 为什么obj1.myA始终保持值1?

这和闭包没关系哦~原因很直白:

  • 当你调用MyObject1(1,2)时,参数a是数字(基本类型),JavaScript里基本类型是值传递——也就是说,返回对象里的myA拿到的是a的一个副本,而不是对a的引用
  • 这个副本直接存在obj1对象的myA属性里,只要你不主动修改obj1.myA(比如obj1.myA = 3),它就会一直保持初始的1

3. hello是不是闭包?

严格来说,这个hello函数不是闭包。闭包的核心定义是:一个函数能够访问并保留其定义时所在的词法作用域中的变量,即使这个函数在其词法作用域之外执行。
而你的hello函数内部只是返回了固定字符串"Hello !",它并没有引用MyObject1函数作用域里的任何变量(比如a或b)。如果把hello改成这样,它才是闭包:

var MyObject1 = function (a, b) {
  return {
    myA : a,
    myB : b,
    hello : function () {
      return "Hello " + a + "!"; // 这里引用了外部作用域的a
    }
  } ;
} ;

这时hello函数捕获了MyObject1作用域里的a,即使MyObject1执行完毕,hello依然能访问到这个a的值,这才是闭包的典型场景。

内容的提问来源于stack exchange,提问作者Alicia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:50:21