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

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

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

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

Q&A

解決済

1回答

226閲覧

js - コールバック関数の中でメソッドを実行したオブジェクトを参照するには

tiitoi

総合スコア21956

JavaScript

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

0グッド

0クリップ

投稿2020/10/24 06:32

質問内容

http.createServer() にオブジェクトが呼び出されたときのコールバック関数を指定しますが、これにメンバ関数を指定した場合に呼び出し元のオブジェクトを参照する方法を教えていただきたいです。
下のコードだと、コールバック関数に指定している on_message_recieved() 内で this.log_dir を参照したいのですが、現状だと undefined になってしまいます。
調べたら、匿名関数の場合だと var self = this; を使う方法などが出てきたのですが、メンバ関数の場合にどのようにすればいいかわかりません。

よろしくおねがいします。

環境

  • nodejs: v12.18.1

コード

js

1http = require("http") 2 3class Server { 4 constructor() { 5 this.log_dir = "log"; 6 } 7 8 start() { 9 this.server = http.createServer(this.on_message_recieved).listen(8000); 10 } 11 12 on_message_recieved(req, res) { 13 console.log(this.log_dir); // "log" と出力されてほしい これを参照したいが undefined になる 14 res.end("OK"); 15 } 16} 17 18var server = new Server() 19server.start()

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういうことでしょうか。

diff

1http = require("http") 2 3class Server { 4 constructor() { 5 this.log_dir = "log"; 6 } 7 8 start() { 9- this.server = http.createServer(this.on_message_recieved).listen(8000); 10+ this.server = http.createServer(this.on_message_recieved.bind(this)).listen(8000); 11 } 12 13 on_message_recieved(req, res) { 14 console.log(this.log_dir); // "log" と出力されてほしい これを参照したいが undefined になる 15 res.end("OK"); 16 } 17} 18 19var server = new Server() 20server.start()

投稿2020/10/24 06:47

gentaro

総合スコア8947

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

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

tiitoi

2020/10/24 07:04

意図通りできました。bind() というものを知らなかったので勉強します。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問