我有一个关于这个功能的问题:
var MyObject3 = function (a, b) {
var obj = { myA : a, myB : b } ;
obj.foo = function () { return obj.myA + obj.myB ; } ;
obj.bar = function (c) { return obj.myA + c ; } ;
return obj ;
} ;
obj.foo和obj.bar是闭包(我理解)。我先写:
obj3 = MyObject3(1, 2) ;
,结果是:{"myA" :1,"myB" :2}
。还行吧。我尝试更改obj3.myA的值:> obj3.myA = 4; obj3;结果是:{"myA" :4,"myB" :2}
。我不明白的是:为什么> obj3.foo() ;
会返回6? obj3.foo()给出了6个结果? obj3.foo()应该是一个闭包不是吗?结果应该是; 3?
答案 0 :(得分:1)
函数MyObject3
在其范围内定义一个变量,该变量引用一个新创建的对象:
var obj = { myA : a, myB : b } ;
该函数范围内对obj
的所有引用都引用该对象。比该对象由函数返回并保存到变量obj3
。 obj
范围内的MyObject3
和全局范围内的obj3
因此引用相同的对象。
在javascript中,原语(例如数字,布尔值,字符串)按值传递,而对象则通过引用传递。这意味着:
var val1 = 1;
var val2 = val1;
val1 = 4;
console.log(val2); // will log 1
// but:
var obj1 = {foo: 'bar'};
var obj2 = obj1;
obj1.foo = 'baz';
console.log(obj2.foo); // will log 'baz'