質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1714閲覧

Javascriptのthisとアロー関数(Event Emitterを用いたとき)

naoya7076

総合スコア28

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/11/27 03:13

編集2018/11/27 03:16

Event Emitterを用いてモジュールを作成しました。
下記コードのときはうまくいくのですが、11行目あたりを

JSCafe.prototype.request = function (url) {

から

JSCafe.prototype.request = (url)=>{

に変えると

self.emit('end', buffer);

^

TypeError: self.emit is not a function

というエラーが出てしまいます。

アロー関数にすることによってthis の値を語彙的に束縛しているのかと予想したのですが

具体的にどこが、どのように値が変わり、なぜエラーが出たのかを教えていただきたいです。
また、他の部分に原因があった場合や私が勘違いしていることが原因である場合、そちらも教えていただければ幸いです。

JavaScript

1const https = require('https'); 2const emitter = require('events').EventEmitter; 3const util = require('util'); 4 5function JSCafe() { 6 emitter.call(this); 7} 8 9util.inherits(JSCafe, emitter); 10 11JSCafe.prototype.request = function (url) { 12 let self = this; 13 https.get(url, (res) => { 14 res.setEncoding('utf-8'); 15 let buffer = ''; 16 res.on('readable', () => { 17 buffer += res.read(); 18 }); 19 res.on('end', () => { 20 self.emit('end', buffer); 21 }); 22 res.on('error', (e) => { 23 self.emit('error', e); 24 }); 25 }); 26 return self; 27}; 28 29module.exports = JSCafe;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アロー関数 - MDN
この記事の1行目に注目してください。

アロー関数式 は、その名のとおり矢印を使って記述し、function 式より短い構文で同様な内容を記述することができます。なおthis, arguments, super, new.target を束縛しません。また、アロー関数式は、メソッドでない関数に最適で、コンストラクタとして使うことはできません。

重要な部分を抜粋します

なおthis, arguments, super, new.target を束縛しません。

という訳で「アロー関数」はラムダとか無名関数的な役割が強い存在です。
thisを作って束縛しないから、非同期のコールバック関数やPromiseのthenに投げ込む用途として使い勝手が良い存在に仕上がっています。
従ってこれからのプログラミングにlet self = thisという行は必要ありません。

デメリットを考えると、thisやarguments作ってくれないので、
ニッチな需要が満たせず普通の無名関数function () {}の完全上位互換ではないんですね。
適切に使い分けてください。

そもそも、ES6以降はクラスとインスタンス使う代わりに
thisに依存したプログラミングするなという思想なので、
適切にクラスベースのオブジェクト指向に移行していけば滅多に困る事はありません。
クラスベースに置き換えるか、そのまま行くなら一番お外のfunction宣言はアロー関数に置き換え不可能でそのまま使うかの二択です。

投稿2018/11/27 03:27

編集2018/11/27 03:31
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問