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

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

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

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

Q&A

解決済

3回答

980閲覧

一つ手前の階層のthisを取得する関数はあるのかどうか。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2020/03/07 05:14

前提・実現したいこと

少しに気になったので質問させていただきます。
以下のソースコードはもちろんthisの内容が変わっているのでエラーが発生しますが、
thisの一個手前の階層のthisを取得する便利な関数はあるのでしょうか?

発生している問題・エラーメッセージ

Error: Cannot read property 'a' of undefined

該当のソースコード

class HogeHoge { constructor() { this.a = 10; this.b(); } b() { function a() { console.log(this.a); } a(); } } var dummy = new HogeHoge();

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

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

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

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

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

guest

回答3

0

以下のソースコードはもちろんthisの内容が変わっているのでエラーが発生しますが、

thisの一個手前の階層のthisを取得する便利な関数はあるのでしょうか?

質問通りに回答するとなれば可能です。
Function.prototype.bindを使えば関数に対してthisを束縛することが可能です。


しかしthisの束縛はオススメしません。

JavaScript Ninjaの極意という書籍で、
thisは文脈により4通りの挙動を示すと解説されています。
その条件は複雑怪奇でとてもじゃないけど使いこなせる気はしません。

なのでES2015以降の流れでアロー関数が実装され、
thisの管理を気にする場面はほぼ全て消え去りました。

js

1class HogeHoge { 2 constructor() { 3 this.a = 10; 4 this.b(); 5 } 6 b() { 7 const a = () => { 8 console.log(this.a); 9 } 10 a(); 11 } 12} 13var dummy = new HogeHoge();

こうしておけばclass構文内のメソッド内に於いて、
いくら関数をネストしても常にthisはnewで作ったインスタンスに向くようになります。


イマドキのJavaScriptの書き方2018は私が強く共感している記事です。
その「関数」や「thisを操作するコードは書かない」等のセクションで
アロー関数を利用してthisを避ける事を説いています。

functionキーワードはもう捨てましょう!functionキーワードのthisの取り扱いはトラブルの元です。もう存在しなかったものとして歴史の闇に葬ります。次の書き方は古いfunctionキーワードを使っています。こういう説明を見かけたらゴミ箱にダンクシュートします。

js

1// 古い関数定義 2function name(引数) { 3 本体 4}

今時はアロー関数を使って書いていきます。特に、今時の書き方は、JavaScriptでよく扱う、無名関数との相性が非常に高くなっています。

js

1// 今時の関数定義 2const name = (引数) => { 3 本体 4};

投稿2020/03/07 06:34

miyabi-sun

総合スコア21203

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

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

退会済みユーザー

退会済みユーザー

2020/03/07 23:29

今時の関数定義が私の知ってるものと全然違いますね。 書き方は人それぞれでいいとして、何だか私が置いてかれているような感じでした。 回答ありがとうございます。
guest

0

ベストアンサー

Function.prototype.bind() はどうでしょうか。

javascript

1let oj = { 2 a: "hoge" 3}; 4 5class HogeHoge { 6 constructor() { 7 this.a = 10; 8 this.b(); 9 } 10 b() { 11 function a() { 12 console.log(this.a); 13 }; 14 a.bind(this)(); // HogeHogeオブジェクトの this を aに適用 15 // アロー関数ではなく、古典的な関数宣言なので "hoge" を出力できる。 16 a.bind( oj )(); 17 } 18} 19var dummy = new HogeHoge();

投稿2020/03/07 05:37

編集2020/03/07 05:51
AkitoshiManabe

総合スコア5434

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

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

退会済みユーザー

退会済みユーザー

2020/03/07 05:45

回答ありがとうございます。 bindの手がありましたか、この方法ならいちいち変数を宣言しなくて済みますね。 ベストアンサーにしました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/03/07 23:27

bind、call...少しややこしいですのでマスターする必要がありますね。 ありがとうございます。
guest

0

よくあるのは変数thatやselfに目的のthisを束縛しちゃうってやり方ですね。

class HogeHoge { constructor() { this.a = 10; this.b(); } b() { const that = this; function a() { console.log(that.a); } a(); } } var dummy = new HogeHoge();

FYI:
https://havelog.ayumusato.com/develop/javascript/e570-js_this_context.html

投稿2020/03/07 05:30

rnitta

総合スコア62

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

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

退会済みユーザー

退会済みユーザー

2020/03/07 05:42

回答ありがとうございます。 この方法は以前に使っていたのですが、何か他の方法はないのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問