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

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

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

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

Q&A

解決済

1回答

1935閲覧

アロー関数のプロパティを返したいけどできないです

sakas1231

総合スコア42

JavaScript

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

0グッド

0クリップ

投稿2017/05/22 05:59

javascriptをついこの間始めたのですが、アロー関数内のプロパティを呼び出して出力したくてもエラーが出てしまっていて困っています。
以下スクリプト

let startButton = document.getElementById("startButton"); let init = () => { let greet = "helloWorld"; returnGreet: function (){ console.log(this.greet); } } startButton.addEventListener("click", console.log(init.returnGreet()));

startbutoonを押したらconsole.log(init.returnGreet())が呼ばれるはずなんでですが、
エラーが

renshu.js:6 Uncaught SyntaxError: Unexpected token (

となっています。ここの6行目はreturnGreetのfunction()の括弧を表しています。

なぜでしょうか、回答宜しくお願いします。

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

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

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

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

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

yambejp

2017/05/22 06:04

HTMLのソースを追記下さい。またdocument.getElementById("startButton");はHTML記述後に実行されていますか?
sakas1231

2017/05/22 06:19

この状態で、startButton("click", console.log("called"));と実行してみるとうまくボタンを押すタイミングでcalledが呼ばれているので正しく実行されていると思います。
guest

回答1

0

ベストアンサー

returnGreet: function(){は、ラベル付きステートメントとして処理されると思いますので、関数定義として処理され、無名の関数は許されないので、エラーになっているのでは。
label - JavaScript | MDN

もし、initを関数ではないオブジェクトにしたいのなら、アロー式では書けないです。
オブジェクトリテラルで書くか、
オブジェクト初期化子 - JavaScript | MDN
initでオブジェクトを返して、その中のメソッドとして定義をするのがいいかと思います。

コメントを受けて追記

それではプロパティを関数にしてそれを外で呼び出すためにはどうすればいいのでしょうか?

javascript

1let init = { 2 greet : "helloWorld", 3 returnGreet: function (){ 4 return this.greet; 5 } 6} 7init.returnGreet();

または、

javascript

1let init = ()=>{ 2 let greet = "helloWorld"; 3 return {returnGreet: function (){ 4 return greet; 5 }} 6} 7init().returnGreet();

あるいは、

javascript

1let init = ()=>{ 2 return { 3 greet : "helloWorld", 4 returnGreet: function (){ 5 return this.greet; 6 } 7 } 8} 9init().returnGreet();

投稿2017/05/22 06:12

編集2017/05/22 06:50
Lhankor_Mhy

総合スコア36074

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

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

sakas1231

2017/05/22 06:28 編集

回答ありがとうございます プロパティの中身を関数にするためにはアロー関数ではダメというイン式でいいのでしょうか? それではプロパティを関数にしてそれを外で呼び出すためにはどうすればいいのでしょうか?
Lhankor_Mhy

2017/05/22 06:55

回答に追記しました。 想定されているのは2番目のような気がします。
sakas1231

2017/05/22 07:29

なるほど、やっぱり見やすさ的にアロー関数使わない方がいいんですね ありがとうございました!
Lhankor_Mhy

2017/05/22 09:03

なんか伝わってない気がしますね。これらの違いは、見やすさの問題ではありません。 1番目はただのオブジェクトなので初期化をすることができません。 2番目は関数オブジェクトなので、引数を持たせてコンストラクタ風に使うことができます。また、クロージャを使っているのでgreetはプロパティではないため、外から直接アクセスができません。 3番目は2番目と同様ですが、greetが普通にプロパティなので隠ぺいされておらず、どこからでも参照と書き替えが可能です。
sakas1231

2017/05/23 05:54

詳しくありがとうございます! 3番目に関しては、どこからも参照はできても書き換えは本当にできるのでしょうか? 3番目の関数に対して init().returnGreet(); initF().greet = "helloWorldFunc"; init().returnGreet(); をしてみたのですが結果は同じでした。 関数オブジェクトに対して引数を指定してあげてそれをgreetプロパティに入れてあげることで擬似的に書き換えは可能かと思いますが、上記のように外部からinit.greet = "hoge" としてもinit.returnGreet()は変わらないのではないでしょうか? 長文失礼しました。
Lhankor_Mhy

2017/05/23 06:14 編集

それは返ってきているオブジェクトがそれぞれ別のものだからです。 f1 = init(); f1.greet = "helloWorldFunc"; f2 = init(); f1.returnGreet(); // helloWorldFunc f2.returnGreet(); // helloWorld ということです。 同じことを2番目でやろうとしてもできません。クロージャによってスコープが内部に限定されているからで、たとえばクラスのような設計をするときに、メソッドを介してのみ内部状態を変化させたい時などに使います。
sakas1231

2017/05/24 04:33

度々返信が遅くなってしまって申し訳在りません なるほど、2番目ではreturnされるものがreturnGreetのみ含んだ無名関数で、greetはinitのスコープ内でしかアクセスできないから f1.greet = "helloWorldFunc"; のように、initの外からgreetにアクセスしようとするタイミングでエラーが出る。 一方で3番目はreturnされるオブジェクトの中にgreetがあるから f1.greet = "helloWorldFunc"; としても問題は無い。 という認識でいいのでしょうか? よろしくお願いいたします
Lhankor_Mhy

2017/05/24 05:08

いえ、エラーは出ません。 f1={a:1}; f1.b=2; がエラーにならず、f1が{a:1, b:2}になるのと同様です。 ただ、returnGreetメソッドが参照するものとは違いますから、その戻り値には反映されないと言うことです。
sakas1231

2017/05/24 08:45

なるほど! 大変よくわかりました! 長い間お付き合いいただきありがとうございました!!
Lhankor_Mhy

2017/05/24 08:49

いえいえ、こちらこそ蛇足が長くなりすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問