2016-04-08 9 views
0

に参照するには? zooを正しく参照し、値5のアラート表示を取得するために使用できる構文はどれですか?はどのようにJavaScriptのコード次を考えると、外側部材

更新:可能であれば、gの実装のみを変更する必要があるソリューションを好むでしょう。

+0

グーグルで試してみてください「Javascriptが入れ子にしますこれを機能させる "。 –

答えて

1

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); 
} 
1

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); 
} 

を使用してthisの値を設定するには、ここで.call.applyについてもう少し情報です。

+0

'that'は死んでいます。 「自己」は死んでいる。 –

0

方法について:

({ 
     foo: 1, 
     bar: 2, 
     zoo: 3, 
     test: function(i) { 
     var g = function(_this,i) { 
      alert(i + _this.zoo); 
     } 
     g(this,i); 
     } 
    }).test(2); 
+1

これは問題の回避策を説明していますが、「理由」の部分には答えません。 –

+0

の「理由」について私は@ decezeの説明に同意します。 –

3

thisの「外」の値を保持するために、矢印機能を使用し、zooプロパティの値にアクセスするためにそれを使用します。

({ 
    foo: 1, 
    bar: 2, 
    zoo: 3, 
    test: function(i) { 
    var g = i => alert(i + this.zoo); 
    g(i); 
    } 
}).test(2); 
+0

それは本当に賢いes6のトリックです:P – hargasinski

+0

この構文の現実世界の互換性は何ですか?私は主にウェブブラウザに興味があります。 –

+1

@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