2017-11-04 16 views
0

2つの機能があるとします。javascriptの矢印機能付きコールバック

function foo(callback) { 
... 
} 

function bar() { 
... 
} 

私はバーがパラメータを必要としないと仮定してfoo(bar)foo(() => bar())を呼び出す違いは何ですか?

私は最近、thisに関するエラーが発生しましたが、もう1つは問題ありません。私は矢印関数が関数へのthisコンテキストをバインドすることを知っている、私は違いが何であるか分からない。

参考までに、ここに問題のコードがあります。

socket.disconnect(socket.connect); // line 1 

socket.disconnect(() => socket.connect()); // line 2 

socket.disconnect(function() { socket.connect(); }); // line 3 

この問題は、コンテキストに関連していない可能性があります。それは、適用またはバインドのあるものかもしれません。 line2とline3は正常に動作し、line1だけがエラーを表示するためです。

+1

あなたは 'this'の主題を研究したことがありますか? – trincot

+0

_ "矢印機能がこのコンテキストをバインドすることを知っています" _、いいえ、それはどんなコンテキストにもバインドしません。 'これは何でもあったでしょう。'外側の範囲。 –

+0

"矢印機能は匿名であり、この機能のバインド方法を変更します。"私は文書でそれを読む。 – emil

答えて

2

まず、あなたが説明していることは、矢印の機能とは関係がありません。

thisの値は、機能がどのようにと呼ばれるかによって異なります。関数がオブジェクトのプロパティであり、foo.bar()と呼び出された場合、foo.bar内のthisfooを参照します。

したがって、最後の2つの例では、thisは、の代わりにsocketを参照します。

最初の例では、のメソッドとして関数が実行されないため、thisは別の値を参照します。しかし、socket.connectはおそらくthisとなると予想され、socketと呼ばれます。


簡体例:

function foo(callback) { 
 
    callback(); 
 
} 
 

 
var socket = { 
 
    connect() { 
 
    "use strict"; 
 
    console.log(this); 
 
    }, 
 
}; 
 

 
foo(socket.connect);     // undefined 
 
foo(() => socket.connect());   // socket object 
 
foo(function() { socket.connect()}); // socket object

関連する問題