繁体   English   中英

在JavaScript中设置对象值

[英]Setting object values in JavaScript

我已尽力解决这个问题,现在我被卡住了,为什么第四个警报返回未定义?

function buttonClick()
{
  var myTest = function()
  {
    var _setDirectlyInside = "So far so good...";
    var _setInFunctionCalledInside;
    var _setInFunctionCalledFromOutside;

    (function(){
      _setInFunctionCalledInside = "This would indicate scope isn't the problem?";
    })();

    return {
      basic : "Easy stuff",
      setDirectlyInside : _setDirectlyInside,
      setInFunctionCalledInside : _setInFunctionCalledInside,
      functionCallFromOutside : function(){
        _setInFunctionCalledFromOutside = "Why does this come back as undefined?";
      },
      setInFunctionCalledFromOutside : _setInFunctionCalledFromOutside
    }
  };

  var test = myTest();

  alert(test.basic); // Returns "Easy stuff"
  alert(test.setDirectlyInside); // Returns "So far so good..."
  alert(test.setInFunctionCalledInside); // Returns "This would indicate scope isn't the problem?"

  test.functionCallFromOutside();
  alert(test.setInFunctionCalledFromOutside); // Broken, returns undefined
}

解析度:

setInFunctionCalledFromOutside : _setInFunctionCalledFromOutside, // Won't work
setInFunctionCalledFromOutsideGetter : function(){
    return _setInFunctionCalledFromOutside; // Will work
}

...

alert(test.setInFunctionCalledFromOutside); // Broken, returns undefined
alert(test.setInFunctionCalledFromOutsideGetter()); // Now works

这个:

return {
  basic : "Easy stuff",
  setDirectlyInside : _setDirectlyInside,
  setInFunctionCalledInside : _setInFunctionCalledInside,
  functionCallFromOutside : function(){
    _setInFunctionCalledFromOutside = "Why does this come back as undefined?";
  },
  setInFunctionCalledFromOutside : _setInFunctionCalledFromOutside
}

......不会造成setInFunctionCalledFromOutside总是返回相同的值_setInFunctionCalledFromOutside 相反, _setInFunctionCalledFromOutside将在return语句执行时进行计算,其值将放在setInFunctionCalledFromOutside 因此, functionCallFromOutside()setInFunctionCalledFromOutside没有影响。

@nnnnnn 说得最好 ,但他删除了他的回答。 setInFunctionCalledFromOutside 不是指向 _setInFunctionCalledFromOutside 的指针 在创建返回的对象时,为setInFunctionCalledFromOutside分配了_setInFunctionCalledFromOutside具有的值。 由于尚未分配任何值,因此值undefined 更改一个的值,不会更改另一个的值。

一个更简单的例子说明了同样的原则:

var i = 0;
var n = i;
i++;
alert(i);  // 1
alert(n);  // still 0

要添加到其他人 - 供参考,JS按值传递字符串和数字。 它通过引用传递/分配对象,数组和函数。

这不是你要击中的障碍(因为你的内部变量在你将它分配给你的外部变量时是undefined的),但即使你确实修复了第一部分:

var internal = "string";
return {
    external : internal,
    setInternal : function (val) { internal = val; }
};

这仍然无法解决问题,因为obj.external将永远是“字符串”。
为什么?
因为在赋值时将external设置为与internal相同的值,并且不等于internalreference (即:指向它的指针)。

如果您正在寻找指针,那么将internal一个对象:

var internal = { string : "my string" };
return {
    external : internal,
    setInternal : function (val) { internal.string = val; }
};

obj.external.string;  // "my string"
obj.setInternal("Bob was here");
obj.external.string;  // "bob was here"

它为什么现在有用?
因为internal是一个对象,当你分配external的值时,你给它一个指向internal也有一个指针的对象的指针。
当你更改internal的属性时,比如internal.string ,因为external指向同一个对象, external.string具有相同的值。

如果你将internal设置为完全不同的东西,那么你将internal指向别的东西(比如internal = null; ),因此当你修改internal时, external将不再改变,因为internal不再指向它使用的对象成为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM