1

これを解決するために最善を尽くしましたが、行き詰まってしまいました。4 番目のアラートが未定義を返すのはなぜですか?

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
4

3 に答える 3

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

于 2012-11-10T00:26:19.593 に答える
1

@nnnnnn はそれを最もよく言ったが、彼は自分の答えを削除した。 へのポインタsetInFunctionCalledFromOutsideではありません_setInFunctionCalledFromOutside。返されたオブジェクトが作成された時点で、持っていsetInFunctionCalledFromOutsideた値が割り当てられまし_setInFunctionCalledFromOutsideた。まだ値が割り当てられていないため、値は でしたundefined。一方の値を変更しても、他方の値は変更されません。

同じ原理を示す簡単な例:

var i = 0;
var n = i;
i++;
alert(i);  // 1
alert(n);  // still 0
于 2012-11-10T00:39:23.247 に答える
1

他に追加する - 参考までに、JS は文字列と数値を値で渡します。オブジェクト、配列、および関数を参照によって渡したり割り当てたりします。

これは、ヒットしている問題ではありません (内部変数はundefined、外部変数に割り当てるまでにあるため) が、最初の部分が修正されたとしても、次のようになります。

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

obj.external常に「文字列」であり続けるため、それでも問題は解決しません。
なんで?代入時と同じ値に
設定し、 of (つまり、それへのポインタ) と等しくないように設定したためです。externalinternalreferenceinternal

ポインターを探している場合は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 はオブジェクトであるため、 の値
を代入すると、ポインタを持つオブジェクトへのポインタが与えられます。 のプロパティを変更すると、 は同じオブジェクトを指しているため、は同じ値を持ちます。externalinternal
internalinternal.stringexternalexternal.string

internal完全に異なるものに設定すると、別のinternalもの ( などinternal = null;) を指しているため、externalを変更しても変更されなくなります。 は以前のオブジェクトを指していないためです。internalinternal

于 2012-11-10T00:53:33.637 に答える