Is this a variable scoping bug in NodeJS or do I j

2019-06-27 05:34发布

Working on a NodeJS project, I came a across this very unexpected behaviour that I can't figure a way around - it seems like a bug to me, but perhaps I'm simply misunderstanding how NodeJS modules operate.

I've reduced it into a testcase as follows:

mod.js module

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

test.js file

var testObj = {one: 'one'};


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

var cachedObj = testObj;
require('./mod').process(cachedObj);

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

Then running $ node test.js gives me this:

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

I'm assigning the value of testObj to cachedObj, and testObj is never being passed to the module method. testObj should (as far as I can see) never be modified at all.

In fact, cachedObj should surely never be modified either, as it is never returned from the mod.process method. Where am I going wrong?

(running Node 0.6.9)

3条回答
Juvenile、少年°
2楼-- · 2019-06-27 05:55

cachedObj and testObj refers to the same object literal, so if you modify one variable, it is of course seen in both since the variables are just aliases referring to the same object.

Also, objects are passed by reference in JavaScript, so if you modify it inside process.js, the object will be modified.

查看更多
可以哭但决不认输i
3楼-- · 2019-06-27 06:02

Objects are passed by reference.

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

Since cachedObj and testObj point to the same object (cachedObj === testObj is true), modifying a property of cachedObj will also result in a modified testObj.

查看更多
Summer. ? 凉城
4楼-- · 2019-06-27 06:08

It's not a bug, it's perfectly expected behavior.

Variables in JavaScript are passed by reference, so the original object is mutated by the assignment in process.

查看更多
登录 后发表回答