这是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,
由于cachedObj
和testObj
指向相同的对象( cachedObj === testObj
为true
),修改cachedObj
的属性也将导致修改后的testObj
。
cachedObj
和testObj
指的是同一个对象字面值,所以如果你修改了一个variables,这当然可以在两个variables中看到,因为variables只是引用同一个对象的别名。
另外,对象在JavaScript中通过引用传递,所以如果在process.js中修改它,对象将被修改。