为何该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
相关产品推荐
相关产品推荐

