这是NodeJS中的一个variables范围问题,还是我需要更多的睡眠?

在一个NodeJS项目上,我遇到了一个非常意想不到的行为,我无法解决这个问题 – 这对我来说似乎是一个bug,但也许我只是误解了NodeJS模块的运行方式。

我把它缩减为一个testing用例如下:

mod.js模块

  exports.process = function(obj){obj.two ='two';  }; 

test.js文件

 var testObj = {one:'one'};


 console.log(['Before:',testObj]);

 var cachedObj = testObj;
 。要求( './ MOD')处理(cachedObj);

 console.log(['After:',testObj]);

然后运行$ node test.js给我这个:

  ['Before:',{one:'one'}]
 ['After:',{one:'one',two:'two'}] 

我将testObj的值testObj cachedObj ,而testObj永远不会传递给模块方法。 testObj应该(据我所知) 永远不会被修改。

事实上, cachedObj肯定不会被修改,因为它从来没有从mod.process方法返回。 我哪里错了?

(运行节点0.6.9)

这不是一个错误,这是完美的预期行为。

JavaScript中的variables是通过引用传递的,所以原始对象被process的赋值所突变。

对象通过引用传递。

 var testObj = {one: 'one'}; // <--- Object var cachedObj = testObj; // cachedObj and testObj point to the same object, 

由于cachedObjtestObj指向相同的对象( cachedObj === testObjtrue ),修改cachedObj的属性也将导致修改后的testObj

cachedObjtestObj指的是同一个对象字面值,所以如果你修改了一个variables,这当然可以在两个variables中看到,因为variables只是引用同一个对象的别名。

另外,对象在JavaScript中通过引用传递,所以如果在process.js中修改它,对象将被修改。