4

次のエラー コードを検討してください。

x = {
  y : "why",
  z : function() {
    return y + " zed";
  }
}

関数 z は機能しません: 「ReferenceError: y が定義されていません」。

xy として完全に指定せずに関数 z 内から y にアクセスする方法はありますか?

もちろん、これを次のように書き換えることもできます。

x = function() {
  var self = this;
  this.y = "why";
  this.z = function() {
    return self.y + " zed";
  };
  return this;
}();

...しかしまあ。

4

4 に答える 4

3

関数を次thisのように呼び出す場合に使用するだけです。x.z()

var x = {
    y : "why",
    z : function() {
        return this.y + " zed";
    }
};

デモ: http://jsfiddle.net/hZxVu/

于 2012-05-24T15:31:27.280 に答える
0

@VisioN には簡単な答えがあります。コードを次のように書き直すと、これが必要な理由を視覚化するのに役立つ場合があります。

var x = {};
x.y = "why";
x.z = function() {return this.y + " zed"; };
alert(x.z());

ここで y と z はオブジェクトのプロパティですが、関数クロージャのスコープはありません。親オブジェクトのプロパティにアクセスするには、「this」キーワードが必要です。

あるいは、

var x = function () {
    var y = "why";     
    var z = function () { return y + " zed?"; };    
    return z();
};
alert(x());

これは、 this を使用せずに y にアクセスすることによる機能的スコープを示しています。xの内部yは既知です。外ではそうではありません。

于 2012-05-24T16:07:49.573 に答える
0

公開モジュール パターンを使用する:

    var x = (function () {
        y = "why";
        z = function() {
            return y + " zed";
        };
        return {
            "y": y,
            "z": z
        };
    })();

    //now you can call:
    x.y // "why"
    x.z() // "why zed"
于 2015-03-03T17:11:31.097 に答える
0

いいえ、そのように書き直す必要があります。yはそのオブジェクトのプロパティであり、オブジェクトなしではアクセスできません-selfクロージャーから変数にアクセスする(たとえば、書き換えで)のとは異なります。

もちろん、関数 as を呼び出すとx.z()thisキーワードもオブジェクトを指すため、次のように記述できます。

return this.y + " zed";

そのオブジェクトのコンテキストで常に関数を呼び出す限り。

于 2012-05-24T15:34:57.740 に答える