在JavaScript中设置对象值

时间:2012-11-10 00:20:55

标签: 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

3 个答案:

答案 0 :(得分:2)

此:

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无效。

答案 1 :(得分:1)

@nnnnnn said it best,但他删除了答案。 setInFunctionCalledFromOutside 指针指向_setInFunctionCalledFromOutside。在创建返回的对象时,setInFunctionCalledFromOutside被赋予_setInFunctionCalledFromOutside所具有的值。由于尚未分配任何值,因此值为undefined。改变一个的值,不会改变另一个的值。

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

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

答案 2 :(得分:1)

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

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

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

仍然无法解决问题,因为obj.external将始终是“字符串” 为什么呢?
因为您在分配时将external设置为与internal相同的值,并且不等于reference的{​​{1}}(即:指向它的指针) )。

如果您正在寻找指针,请将internal作为对象:

internal

为什么现在有效?
因为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" 时,你给它一个指向external也有一个指针的对象的指针。
当您更改internal的属性时,例如internal,因为internal.string指向同一个对象,external具有相同的值。

如果您将external.string设置为完全不同的内容,那么您将internal指向其他内容(例如internal),因此internal = null;将不再更改,修改external,因为internal不再指向以前的对象。