Javascript关闭代码

时间:2018-05-23 18:15:32

标签: javascript

我有一个关于这个功能的问题:

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?

1 个答案:

答案 0 :(得分:1)

函数MyObject3在其范围内定义一个变量,该变量引用一个新创建的对象:

var obj = { myA : a, myB : b } ;

该函数范围内对obj的所有引用都引用该对象。比该对象由函数返回并保存到变量obj3obj范围内的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'