2015-10-22 11 views
7

ES6が私たちに与える=>機能を使ってコンテキストを継承して実験したところ、このコンテキストを決して変更できないことに気付きました。 例:=>演算子と関数キーワードを使用せずにこのスコープとは異なるES6 =>関数演算子

var otherContext = { 
    a: 2 
}; 
function foo() { 
    this.a = 1; 

    this.bar =() => this.a; 

} 

var instance = new foo; 
instance.bar(); // returns 1 
instance.bar.bind(otherContext)(); // returns 1 

したがって
function foo() { 
    this.a = 1; 

    this.bar = function() { 
    return this.a; 
    } 
} 
var instance = new foo; 
instance.bar(); // returns 1 
instance.bar.bind(otherContext)(); // returns 2 

、我々は外部の呼び出しから機能を受け取るか、単に変数で関数を持っている場合、どのようにすることができます我々はそれを別のものに束縛することができるのか、それともどこかからそれを継承するのかどうかを確かめます。

JavaScriptは何も教えてくれませんが、非常に微妙で難しいバグのために落ちる危険性があります。

+0

私は本当にそこに質問を見ることができません、あなたはこの動作について理解していないものがありますか? –

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ投稿者 明確にするために疑問符を追加しました –

+0

外部ソースから太い矢印関数を受信することは珍しいことです。そうであれば、他のコンテキストでも呼び出し可能になるようには設計されていません。 –

答えて

6

これは実質的にはbindの新しい構文なので、これはgotchasの方法では何も新しいものを導入しません。

var otherContext = { 
 
    a: 2 
 
}; 
 
function foo() { 
 
    this.a = 1; 
 
    this.bar = function() { return this.a }.bind(this); 
 
} 
 

 
var instance = new foo; 
 
log(instance.bar()); // returns 1 
 
log(instance.bar.bind(otherContext)()); // returns 1 
 

 
function log(value) { 
 
    document.body.appendChild(
 
    document.createTextNode(value) 
 
); 
 
}

我々は外部の呼び出しから機能を受け取るか、単に変数で関数を持っている場合ので、私たちはどのように確認することができ、我々は結合することが可能であることを行っている場合それを違うのか、それともどこかでそれを継承するのか?

ため、次のいずれか

    あなたが最初の場所でその関数を書かれているでしょう
  1. またはあなたは、人々がに知っているように、あなたの関数を呼び出す方法については仕様を書かれているでしょう
  2. 選択したコンテキストから thisを使用する関数を渡します。
+0

あなたの番号付きポイントは、私のコメントをはるかに簡潔に表現します。+1。 –

5

キーワードfunctionを使用する場合、ルールバインドthisはかなり単純です。

いずれ呼び出しコール設定this周知値取得またはthis.call.applyまたは関数がメソッドとして呼び出されたときにJavaScriptがthis設定介してである):ノーマルモードで

  • thisウィンドウオブジェクトになります。
  • strictモードでは、thisは未定義です。

矢印機能では、ルールはさらに簡単です。

  • thisキーワードはありません。 thisはどこから来ることがあるので、矢印関数内で、thisは、常に外のコンテキストにバインドされている、ということを意味します(でも、引数、またはいくつかの他)

だから、要約する:矢印の機能を使用する場合

thisの値は常に外側の文脈から来ています。

+0

矢印関数の引数はありませんか? –

+0

もちろん、矢印関数は引数を受け取ることができます。しかし、 'function'キーワードを使用すると自動的に作成される' arguments'オブジェクトは自動的に作成されません。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments –

関連する問題