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

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

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

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

Q&A

解決済

3回答

587閲覧

アロー関数のthisについて[es6]

kirokira

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2019/07/23 17:25

javascriptのアロー関数におけるthisの挙動についてお尋ねしたいことがあります。
例えば下記のようなコードがあったとします。

let person3 = { firstname: "次郎", age: 21, getOlder: ()=> { this.age++; } } person3.getOlder(); console.log(person3);

私の予想だとageは22でしたが、確認した結果21でした。
アロー関数のthisは親スコープのthisを引き継ぐと教材で習いましたので

{ // 親ブロックスコープ {    // 子ブロックスコープ } }

だとすれば、私の認識だと先程のコードは

let person3 = { // 親ブロックスコープ firstname: "次郎", age: 21, getOlder: ()=> { // 子ブロックスコープ this.age++; } } person3.getOlder(); console.log(person3);

であり、親ブロックに存在しているageを引き継ぎ、getOlderを実行すると思っていたのですが間違っているのでしょうか?わかりにくい質問で申し訳ありませんが、回答よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

結論から言うと、もしperson3がグローバルスコープ(すべてのfunctionの外)であれば、getOlder関数のthiswindowになります。

簡単なdebugで確かめてみるとわかりやすいです。

let sample = { normal: function () { console.log(this, this === window) }, arrow: () => { console.log(this, this === window) } } sample.normal() // -> sample, false sample.arrow() // -> window, true

kirokiraさんの例では、window.age++を行なっていることになりますので、person3.ageは変更されていないことになります。

person3.ageを更新したい場合は、上のサンプルコードにように、functionとして定義することで達成できます。

let person3 = { firstname: "次郎", age: 21, getOlder: function () { this.age++; } } person3.getOlder(); console.log(person3);

投稿2019/07/23 18:36

NozomuIkuta

総合スコア1260

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

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

0

ベストアンサー

アロー関数のthisは親スコープのthisを引き継ぐと教材で習いました

正しいです。
ただし、その「スコープ」はレキシカルスコープです。
オブジェクト初期化子はレキシカルスコープを生成しないので、変数person3の外側のthisを参照します。

なお、コメントに「親ブロックスコープ」とありますが、これはブロックではないので、間違いです。

投稿2019/07/24 00:49

Lhankor_Mhy

総合スコア36074

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

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

0

汎用性を無視すれば自分自身の名前を参照すればできます

javascript

1const person3 = { 2 firstname: "次郎", 3 age: 21, 4 getOlder: ()=>person3.age++, 5} 6person3.getOlder(); 7console.log(person3);

投稿2019/07/24 00:39

yambejp

総合スコア114784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問