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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

3202閲覧

JavaScriptのコードが、safariでfunctionを使用した時のみエラーになるので理由が知りたいです

TYABUDAI6

総合スコア8

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

JavaScript

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/05/21 11:03

編集2021/05/21 11:04

状況と質問内容

以下の「該当コードとエラー画面」にあるコードを実行すると、safariでfunctionを使用した場合のみReferenceError: Can't find variable: switcherと表示されてエラーになりました。
スコープなどの問題かと考えたのですが、あまりJavaScriptに詳しくなく、結論が出なかったため質問させていただきました。

以下質問内容になります。

質問1.
私の認識では、構文にも特に間違った部分はないと考えているのですが、これはコードの書き方の問題なのか、safari、chromeどちらかのブラウザのバグなのかどちらでしょうか?
コードが悪い場合、正しいコードに直していただけないでしょうか。

質問2. functionとアロー関数では何が違うのでしょうか?

該当コードとエラー画面

デモ: CodePen(https://codepen.io/w-muro/pen/GRWrPom?editors=1111)

javascript

1const func = document.querySelector(".function"); 2if(func){ 3 const say = "Hello" 4 const switcher = true 5 function greeting(){ 6 if(switcher){ 7 console.log(say); 8 } 9 } 10 func.addEventListener("click", greeting); 11} 12 13// arrow ============================================= 14const arrow = document.querySelector(".arrow"); 15if(arrow){ 16 const say = "Hello" 17 const switcher = true 18 const greeting = () => { 19 if(switcher){ 20 console.log(say); 21 } 22 } 23 arrow.addEventListener("click", greeting); 24}

エラー画面

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

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

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

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

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

guest

回答1

0

ベストアンサー

元来、function(変数に代入するのではなくfunctionから書き始めるもの)は、コード全体もしくは関数のスコープで書かなければならず、ifなどのブロック内に書くことは文法外の実装となっていました。

ES2015以降のstrictモードでは、function文のブロックスコープが保証されるようになりましたが、strictにしていない場合は以前と同様、どのように動くか保証されません。

厳格モードは ES2015 に導入され、ブロック内の関数がそのブロックのスコープを持ちます。ES2015 より前では、ブロックレベルの関数は厳格モードで禁止されていました。(MDNより)

投稿2021/05/21 11:10

maisumakun

総合スコア146018

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

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

maisumakun

2021/05/21 11:23 編集

ブロック内でfunctionを書いても、関数式(let foo = function(){}など、関数リテラルを値として使うもの)は全く問題ありません。 const greeting = function(){ /* 略 */ };とするか、addEventListenerの引数に直接functionを書くかで対応できます。
maisumakun

2021/05/21 11:17

> 私の認識では、構文にも特に間違った部分はないと考えているのですが あまり目立ってはいませんが構文の問題です。
TYABUDAI6

2021/05/21 11:47

ご回答ありがとうございます。 >const greeting = function(){ /* 略 */ };とするか、addEventListenerの引数に直接functionを書くかで対応できます。 エラーが発生しないことを確認できました。 >ES2015以降のstrictモードでは、function文のブロックスコープが保証されるようになりましたが、 こちらも、'use strict'; を追記することでエラーが発生しなくなりました。 今まで、function greeting(){} と const greeting = () => {} は同じものだと考えていましたが、function文と関数リテラルで違うものだと実感を持って理解することができました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問