Как локально изменить свойство объекта параметров, не переопределяя его глобально - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь понять, как правильно сохранить свойства объекта параметров в глобальной области видимости, изменяя их локально внутри других функций.

Я пытаюсь сделать следующее: у меня есть одна функция, которую используют все остальные, которая принимает конкретные имена параметров.Итак, мне нужна каждая из начальных функций, которые используют эту разделяемую функцию, чтобы иметь возможность переопределить значение свойства объекта параметров, а затем выполнить разделяемую функцию, используя имя общего параметра, но с его уникальным значением свойства.

Пример ниже демонстрирует мою проблему.В этом примере все функции (как показано в console.log) выдают правильное значение, за исключением конечной функции.Частично проблема заключается в том, что cat () и dog () переопределяют значение options.x глобально, а не локально.Я надеялся, что смогу использовать let для локального изменения параметров, а затем передать его в mouse (), но использование let options.x = 3; let x = options.x; приведет к ошибке.

Я слышал, что могу вернуть / переопределить глобальное значение options.x области действия после запуска функции для его возврата, но я бы предпочел никогда не изменять глобальные значения параметров в глобальной области видимости, если это возможно.Таким образом, я не рискую случайно использовать функции, используя уникально определенные параметры друг друга.

var options = {x: 10}
console.log(options.x + ' original options object');

cat(options);
function cat() {
  options.x = 3;
  x = options.x;
  console.log(x + ' cat = 3'); // this should equal 3
  mouse(x);
}

dog(options);

function dog() {
  options.x = 7;
  x = options.x;
  console.log(x + ' dog = 7'); // this should equal 7
  mouse(x);
}

// SHARED FUNCTION
function mouse() {
  console.log(x + ' mouse = cat() and/or dog()'); // I want this to equal 3 for cat() and 7 for dog() just as it is with x defined inside cat() and dog().
}

console.log(options.x + ' final global scope check = 10'); // I want this to remain 10, not 3. But the changes in cat() are poluting the global definition of options.x.

Приведенный ниже код просто исключает объект параметров и, кажется, работает легко.Может быть, я должен просто избегать использования объекта вообще, чтобы избежать этих проблем?

var param = 1;
console.log(param + ' param should = 1');

cat();
function cat() {
  var param = 3;
  console.log(param + ' param should = 3');
  mouse(param);
}

dog();
function dog() {
  var param = 7;
  console.log(param + ' param should = 7'); 
  mouse(param);
}

// SHARED FUNCTION
function mouse(param) {
 	console.log(param + ' should log as whatever value the other functions sent');
}

console.log(param + ' param global check');

1 Ответ

0 голосов
/ 24 февраля 2019

Проблема в том, что вы каждый раз переназначаете объект options, поскольку объекты являются ссылочными типами.Даже если вы сделаете что-то подобное в своей функции: newOptions = options, вы все равно будете ссылаться на ваш старый options объект, и любые изменения в "новом" newOptions объекте также изменят объект options.

Однако, если вы хотите получить точно такой же объект и изменить его, не затрагивая другой, вы должны клонировать его.Вы можете добиться этого в JavaScript с помощью метода Object.create().Вы можете прочитать больше об этом здесь .

Таким образом, весь ваш код будет выглядеть так:

var options = {x: 10}
console.log(options.x + ' original options object');

cat(options);
function cat(options) {
  newOptions = Object.create(options);
  newOptions.x = 3;
  x = newOptions.x;
  console.log(x + ' cat = 3'); // this should equal 3
  mouse(x);
}

dog(options);

function dog(options) {
  newOptions = Object.create(options);
  newOptions.x = 7;
  x = newOptions.x;
  console.log(x + ' dog = 7'); // this should equal 7
  mouse(x);
}

// SHARED FUNCTION
function mouse(x) {
  console.log(x + ' mouse = cat() and/or dog()'); // I want this to equal 3 for cat() and 7 for dog() just as it is with x defined inside cat() and dog().
}

console.log(options.x + ' final global scope check = 10'); // I want this to remain 10, not 3. But the changes in cat() are poluting the global definition of options.x.
...