如何在不更改全局范围的情况下在本地更改选项对象属性

时间:2019-02-23 20:36:25

标签: javascript object properties global

我正在尝试了解在其他函数内部局部更改选项对象属性在全局范围内相同的正确方法。

我要完成的工作是:我有一个函数供所有其他人使用,它接受特定的参数名称。因此,我需要使用该共享函数的每个初始函数都能够重新定义options对象的属性值,然后使用共享参数名及其唯一属性值执行共享函数。

下面的示例演示了我的问题。在该示例中,除最终功能外,所有功能(如通过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.

下面的代码只是消除了options对象,并且看起来很容易工作。也许我应该完全避免使用该对象来避免这些问题?

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 :(得分:1)

问题在于,由于对象是引用类型,因此每次都要重新分配对象options。即使您在函数中执行以下操作:newOptions = options,您仍然会引用旧的options对象,并且对“新” newOptions对象的任何更改也会更改{{1 }}对象。

但是,如果要获取完全相同的对象并对其进行更改而又不影响另一个对象,则必须将其克隆。您可以使用options方法在JavaScript中实现此目的。您可以详细了解here

因此您的整个代码将如下所示:

Object.create()