在JavaScript中设置对象值

在JavaScript中设置对象值,javascript,Javascript,我已经尽了最大努力来解决这个问题,现在我被卡住了,为什么第四个警报返回未定义 function buttonClick() { var myTest = function() { var _setDirectlyInside = "So far so good..."; var _setInFunctionCalledInside; var _setInFunctionCalledFromOutside; (function(){ _setI

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

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
这:

…不会导致SetInFunctionCalledFromOut始终返回与_SetInFunctionCalledFromOut相同的值。相反,将在执行return语句时对_setinFunctionCalledFromOut求值,并将其值置于setinFunctionCalledFromOut中。因此,functionCallFromOutside对setInFunctionCalledFromOutside没有影响。

这:

…不会导致SetInFunctionCalledFromOut始终返回与_SetInFunctionCalledFromOut相同的值。相反,将在执行return语句时对_setinFunctionCalledFromOut求值,并将其值置于setinFunctionCalledFromOut中。因此,functionCallFromOutside对setInFunctionCalledFromOutside没有影响。

,但他删除了他的答案。SetInFunctionCalledFromouter不是指向_SetInFunctionCalledFromouter的指针。在创建返回的对象时,SetInFunctionCalledFromOut被分配了_SetInFunctionCalledFromOut拥有的值。由于尚未分配任何值,因此该值未定义。更改其中一个的值不会更改另一个的值

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

var i = 0;
var n = i;
i++;
alert(i);  // 1
alert(n);  // still 0
,但他删除了他的答案。SetInFunctionCalledFromouter不是指向_SetInFunctionCalledFromouter的指针。在创建返回的对象时,SetInFunctionCalledFromOut被分配了_SetInFunctionCalledFromOut拥有的值。由于尚未分配任何值,因此该值未定义。更改其中一个的值不会更改另一个的值

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

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

为了添加到其他文件中-供参考,JS通过值传递字符串和数字。 它通过引用传递/分配对象、数组和函数

这并不是您遇到的障碍,因为在您将内部变量指定给外部变量时,内部变量尚未定义,但即使您已修复了第一部分:

var internal = "string";
return {
    external : internal,
    setInternal : function (val) { internal = val; }
};
这仍然不能解决问题,因为obj.external将始终是字符串。 为什么? 因为您在赋值时将external设置为与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"
为什么它现在起作用了? 因为internal是一个对象,当您指定external的值时,您会给它一个指向该对象的指针,而internal也有一个指向该对象的指针。 当您更改internal的属性(如internal.string)时,因为external指向同一对象,external.string具有相同的值


如果您将internal设置为完全不同的值,那么您将internal指向其他值,如internal=null;,因此,当您修改internal时,external将不再更改,因为internal不再指向它以前所指向的对象。

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

这并不是您遇到的障碍,因为在您将内部变量指定给外部变量时,内部变量尚未定义,但即使您已修复了第一部分:

var internal = "string";
return {
    external : internal,
    setInternal : function (val) { internal = val; }
};
这仍然不能解决问题,因为obj.external将始终是字符串。 为什么? 因为您在赋值时将external设置为与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"
为什么它现在起作用了? 因为internal是一个对象,当您指定external的值时,您会给它一个指向该对象的指针,而internal也有一个指向该对象的指针。 当您更改internal的属性(如internal.string)时,因为external指向同一对象,external.string具有相同的值


如果您将internal设置为完全不同的值,那么您将internal指向其他值,如internal=null;,因此,当您修改internal时,external将不再更改,因为internal不再指向它以前的对象。

我认为functionCallFromOutside只包含函数定义,稍后将由test执行。functionCallFromOutside?我的想法哪里错了?那不是你的想法错了。当您调用test.functionCallFromOutside时,它正在执行。问题在于,当函数设置_setInFunctionCalledFromOutside=时,为什么会返回为未定义?它还将更新setInFunctionCalledFromOutside属性。啊,我知道哪里出了问题,我不希望它也会这样更新值,但我感觉setInFunctionCalledFromOutside更像是一个C getter属性
Y将其更改为一个函数,然后像getter一样调用该函数,可以得到所需的结果。谢谢你的帮助!我认为functionCallFromOutside只包含函数定义,稍后将由test执行。functionCallFromOutside?我的想法哪里错了?那不是你的想法错了。当您调用test.functionCallFromOutside时,它正在执行。问题在于,当函数设置_setInFunctionCalledFromOutside=时,为什么会返回为未定义?它还将更新SetInFunctionCalledFromouter属性。啊,我知道哪里出了问题,我不希望它也会更新值,但我感觉SetInFunctionCalledFromouter的行为更像一个C getter属性。。。将其更改为一个函数,然后像getter一样调用该函数,可以得到所需的结果。谢谢你的帮助!