2016-07-23 19 views
3

私はこのajax呼び出しを発見しました。それは完全に正常に動作します:()=>演算子とは何ですか?

$.ajax({ 
    url: '/items/' + item.id, 
    method: 'PUT', 
    data: {item: item}, 
    success:() => { 
     this.updateItems(item); 
    } 
}); 

私が何() =>手段が取得できませんでした。私は成功を使用:function(){ }をしかし、それは私に

構築物は矢印関数と呼ばれる

+2

これは「矢印関数」と呼ばれ、es6で関数を宣言する新しい方法です。 [こちら](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)はMDNのドキュメントで、[こちら](http://stackoverflow.com/documentation/) javascript/186/functions#t = 201607230227390313154)は、新しいStackOverflowドキュメントです。 –

+2

ThaはES6ラムダ関数です。通常の関数でエラーが発生する理由は、lambdasでは 'this'のスコープが異なるためです。 – VSG24

+0

返信ありがとうございます。まだ1つの懸念。新しい方法で関数を宣言すると、関数old(){}は機能しません。 – user2015

答えて

3

「updateItemsは関数ではありません」というエラーになります。これはES2015標準で導入され、function() {}の構文と同様に動作します。

詳細については、check the MDN docsをご覧ください。

この構文は、すべてのブラウザ、特に古いバージョンではまだサポートされていないため、transpiling it into ES5 compliant JavaScriptを調べる必要があります。


古典function() {}にそれを変換するためにあなたの試みが失敗した理由は、矢印の機能は、周囲の機能のthis値を使用しながら、古典的な機能は、自分のthis値を定義することです。このため、this.updateItemsはもう見つからないのです。

は、これを解決する手動関数コンテキストをバインドするには、次の

$.ajax({ 
    url: '/items/' + item.id, 
    method: 'PUT', 
    data: {item: item}, 
    success: function() { 
     this.updateItems(item); 
    }.bind(this) 
}); 
+1

これが適切な回答であるためには、受け取っているエラーに関するOPの質問に答えてください。これは、矢印構文を使用して 'this'がスコープ/バインドされる方法の違いに起因します。 –

+0

@ this-vidor完了! :-) – Timo

+1

ニース! (downvoteは私のものではありませんでした。) –

0

それはアロー機能だ、ともthisをバインドする匿名関数のようなものです。 function()に切り替えたときには、thisが何かにバインドされていたため、エラーになりました。

編集:

あなたはまだ使用し、その後、より伝統的な構文を使用する場合:

function(){/*...*/}.bind(this) 

あなたが正しいオブジェクトにバインドされていることを確認します。

+0

**説明してください**違い! 「他の何か」は役に立たない。 –

+0

@ this-vidor私は思った。彼の誤りの鍵は、拘束力が違うということでした。 – seairth

+0

JavaScriptは確定的です。この場合、「何か他のもの」は非常に特殊なものです。 'this'は' function'構文を使うときに何に縛られていますか?あなたの編集ははるかに役立ちますが、まだまだ厄介です。 –