Is this a variable scoping bug in NodeJS or do I just need more sleep

♀尐吖头ヾ 提交于 2020-01-14 11:38:25

问题


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)


回答1:


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.




回答2:


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.




回答3:


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.



来源:https://stackoverflow.com/questions/9429058/is-this-a-variable-scoping-bug-in-nodejs-or-do-i-just-need-more-sleep

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!