に参照するには? zoo
を正しく参照し、値5
のアラート表示を取得するために使用できる構文はどれですか?はどのようにJavaScriptのコード次を考えると、外側部材
更新:可能であれば、g
の実装のみを変更する必要があるソリューションを好むでしょう。
に参照するには? zoo
を正しく参照し、値5
のアラート表示を取得するために使用できる構文はどれですか?はどのようにJavaScriptのコード次を考えると、外側部材
更新:可能であれば、g
の実装のみを変更する必要があるソリューションを好むでしょう。
zoo
はフリーフローティング変数ではなく、オブジェクトのプロパティです。 test
の内部では、this
を使用してオブジェクトを参照することができます。 g
内部this
コンテキストは、明示的にそれを保持する必要があるので、しかし失われます。
test: function(i) {
var g = function(i) {
alert(i + this.zoo);
}.bind(this);
g(i);
}
か:あなたは、オブジェクトのメンバ関数を呼び出すと
test: function(i) {
var g = function(i) {
alert(i + this.zoo);
};
g.call(this, i);
}
、this
キーワードがに設定されていますオブジェクト(.call
または.apply
を使用して関数を呼び出す場合を除く)。関数g
はもはやオブジェクトのメンバーではないため、this
はオブジェクトに設定されていません。 g
機能を引き続き使用するには、いくつかのオプションがあります。 this
への参照を設定し
:
test: function(i) {
var that = this;
var g = function(i) {
alert(i + that.zoo);
}
g(i);
}
または手動.call
test: function(i) {
var g = function(i) {
alert(i + this.zoo);
}
g.call(this, i);
}
'that'は死んでいます。 「自己」は死んでいる。 –
方法について:
({
foo: 1,
bar: 2,
zoo: 3,
test: function(i) {
var g = function(_this,i) {
alert(i + _this.zoo);
}
g(this,i);
}
}).test(2);
これは問題の回避策を説明していますが、「理由」の部分には答えません。 –
の「理由」について私は@ decezeの説明に同意します。 –
はthis
の「外」の値を保持するために、矢印機能を使用し、zoo
プロパティの値にアクセスするためにそれを使用します。
({
foo: 1,
bar: 2,
zoo: 3,
test: function(i) {
var g = i => alert(i + this.zoo);
g(i);
}
}).test(2);
それは本当に賢いes6のトリックです:P – hargasinski
この構文の現実世界の互換性は何ですか?私は主にウェブブラウザに興味があります。 –
@MikkoRantalainen [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions#Browser_compatibility](https://developer.mozilla.org/en/docs)で互換性をチェックできます。/Web/JavaScript/Reference/Functions/Arrow_functions#Browser_compatibility)、および[http://www.w3schools.com/browsers/browsers_stats.asp](http://www.w3schools.com/browsers/browsers_stats)のブラウザの人気.asp) – hargasinski
グーグルで試してみてください「Javascriptが入れ子にしますこれを機能させる "。 –