Это ошибка переменной области видимости в NodeJS или мне просто нужно больше спать - PullRequest
4 голосов
/ 24 февраля 2012

Работая над проектом NodeJS, я столкнулся с этим очень неожиданным поведением, которое я не могу обойти: мне кажется, что это ошибка, но, возможно, я просто неправильно понимаю, как работают модули NodeJS.

Я сократил его до уровня теста следующим образом:

модуль mod.js

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

файл test.js

var testObj = {one: 'one'};


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

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

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

Затем выполнение $ node test.js дает мне следующее:

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

Я присваиваю значение testObj для cachedObj, а testObj никогда не передаетсяметод модуля.testObj следует (насколько я вижу) никогда вообще не изменять.

На самом деле, cachedObj также, безусловно, никогда не следует изменять, так как он никогда не возвращается изmod.process метод.Куда я иду не так?

(работает Node 0.6.9)

Ответы [ 3 ]

6 голосов
/ 24 февраля 2012

Это не ошибка, это совершенно ожидаемое поведение.

Переменные в JavaScript передаются по ссылке, поэтому исходный объект мутирует при присваивании в process.

3 голосов
/ 24 февраля 2012

Объекты передаются по ссылке.

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

Поскольку cachedObj и testObj указывают на один и тот же объект (cachedObj === testObj равно true), изменение свойства cachedObj также приведет к изменению testObj.

1 голос
/ 24 февраля 2012

cachedObj и testObj относятся к одному и тому же литералу объекта, поэтому, если вы изменяете одну переменную, она, конечно, видна в обеих, поскольку переменные являются просто псевдонимами, ссылающимися на один и тот же объект.

Кроме того, объекты передаются по ссылке в JavaScript, поэтому, если вы измените их внутри process.js, объект будет изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...