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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

3回答

888閲覧

オブジェクトに対してメソッド名を使って値として登録した関数をアロー関数で表現したい。

takochan1192

総合スコア100

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2020/10/23 14:17

編集2020/10/24 04:53

表記の通り、オブジェクトの中にメソッド名として登録した関数をアロー関数として
表現したいと思ったのですが、エラーが出て実行することができません。

まず、アロー関数を使用せず普通の関数を使う方法が下記

JavaScript

1let user = { 2 name:"ほげ太郎", 3 age:22, 4 address:"ほげ市", 5 hobby:["寝ること","食べること"], 6 getAge:function(){ 7 return this.age; 8 } 9} 10console.log(user.getAge()); 11

これは問題ありません。
次がアロー関数を使用して書き換えたものです。

JavaScript

1let user = { 2 name:"ほげ太郎", 3 age:22, 4 address:"ほげ市", 5 hobby:["寝ること","食べること"], 6 getAge:()=>this.age; 7} 8console.log(user.getAge()); 9 10

this.ageのところにエラーが出ておりまして、
thisのところのエラーは下記。

The containing arrow function captures the global value of 'this'.

また、ageの部分のエラーは下記。

Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.

ソースコードの実行環境はTypeScript Playgroundを使用しております。
どなたかご教示いただけませんでしょうか?

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

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

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

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

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

gentaro

2020/10/23 14:54

書き込んだ後に質問文を確認したりしないのかな? マークダウンの使い方がメチャクチャだけど。
takochan1192

2020/10/24 04:54

ご指摘いただきまして誠にありがとうございました。 おっしゃる通り、めちゃくちゃでございました。大変失礼いたしました。
guest

回答3

0

アロー関数を使用せず普通の関数を使う方法が下記

オブジェクトリテラルに関数をもたせる場合、略記できるようになっています。

javascript

1let user = { 2 name:"ほげ太郎", 3 age:22, 4 address:"ほげ市", 5 hobby:["寝ること","食べること"], 6 getAge(){ // getAge: function getAge() と同じ 7 return this.age; 8 } 9} 10console.log(user.getAge());

アロー関数を使う場合、スコープはアロー関数を宣言したスコープになります。

javascript

1var age = 25; 2const getAge = () => this.age; 3 4let user = { 5 name:"ほげ太郎", 6 age:22, 7 address:"ほげ市", 8 hobby:["寝ること","食べること"], 9 getAge 10} 11console.log( user.getAge() ); // 25

オブジェクトのメソッド(メンバ関数)にアロー関数を定義すると、アロー関数内の this はインスタンスを参照しなくなります。

追記)
アロー関数をメソッド内で宣言した例

javascript

1let user = { 2 name:"ほげ太郎", 3 age:22, 4 address:"ほげ市", 5 hobby:["寝ること","食べること"], 6 getAge, 7 hoge(){ 8 // アロー関数を宣言したスコープは user.hoge() メソッド内のため、this は user を参照する 9 let fn = () => this; 10 return fn(); 11 } 12} 13console.log( user.hoge() );

投稿2020/10/23 22:40

編集2020/10/24 05:31
AkitoshiManabe

総合スコア5432

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

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

takochan1192

2020/10/24 05:14

アロー関数内のthisは、グローバルな変数を参照するのですね。 thisの扱いについて理解することができました。 ご丁寧にご回答いただきまして本当にありがとうございました。
AkitoshiManabe

2020/10/24 05:24

> アロー関数内のthisは、グローバルな変数を参照するのですね。 違います。回答では、「アロー関数を宣言したスコープがグローバル(window)スコープだったので、グローバルな変数を参照できた」という内容です。追記しますね。
takochan1192

2020/10/25 12:24

何度もご回答いただき本当にありがとうございます。 すみません、勘違いしておりました。 追記のコードもありがとうございます。ご丁寧にご教示いただきまして本当にありがとうございました。
guest

0

あまり実用性はないのですがuserで宣言しているのですからuserを参照するという手もあります

javascript

1let user = { 2name:"ほげ太郎", 3age:22, 4address:"ほげ市", 5hobby:["寝ること","食べること"], 6getAge:()=>user.age 7}; 8console.log(user.getAge());

投稿2020/10/24 04:09

yambejp

総合スコア114843

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

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

takochan1192

2020/10/24 05:17

アロー関数だとthisは、関数の実行時にageを参照できないので、無理にthisを使用する必要はないのですね。とりあえず、this使っておけば何とかなると思っていた私ですが、非常に勉強になりました。 サンプルコードにてご教示いただきまして本当にありがとうございました。
guest

0

ベストアンサー

functionにおいてのthisは、実行時においてのthisを指せますが、
アロー関数は、定義時のthisが実行時のthisに入るからです。

つまり、getAgeメソッド実行時は、アロー関数では、userは指せず、定義時のthisである、グローバルオブジェクトが指されます。

ではどうするかというと、
まぁ、どうしてもアローなどでやりたいならば、
staticなクラスで定義するのがよいのでは?
と思います。

typescript

1class user { 2 static public name = "ほげ太郎"; 3 static public age = 22; 4 static public address = "ほげ市"; 5 static public hobby: strung[] = ["寝ること", "食べること"]; 6 7 static public getAge(){ 8 return this.age; 9 } 10}; 11console.log(user.getAge());

投稿2020/10/23 15:57

編集2020/10/23 16:16
miyabi_takatsuk

総合スコア9528

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

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

takochan1192

2020/10/24 05:11

function におけるthisの参照先とアロー関数におけるthisの参照場所が違ったのですね。 同じ関数だから、一緒だろうと思って私が浅はかでした。 非常に勉強になりました。ご丁寧にご回答くださりありがとうございました。
miyabi_takatsuk

2020/10/24 06:59 編集

アロー関数は、 JavaScriptの長所であり、同時にコード保全が著しく困難になる、thisの扱いを、 他の言語に寄せた仕様や、クラスベースを実現できるように生まれたものです。 それまで、bindやcallなど(thisを実行時の引数により束縛するメソッド)をわざわざ使わねば、クラスベースな書き方が難しかったのです。 (prototypeでコントロールする方法はあるが、メソッドの中でfunctionを定義すると、thisの束縛がされない) クラス宣言も、アロー関数の仕様により、実現できたものと思われます。 また、TypeScriptであれば、 今回のような仕様はinterfaceやtypeで実装したほうがいいと思うので、調べられるとよいかと。
takochan1192

2020/10/25 12:16

なんどもご教示いただきまして本当にありがとうございます。 そういった背景があったのは、全く知りませんでした。 interface や typeの使用も含めてもう一度考え直してみます。 ご丁寧に本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問