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

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

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

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

Q&A

解決済

2回答

276閲覧

Javascriptの関数スコープと変数につきまして

SugiuraY

総合スコア317

JavaScript

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

0グッド

0クリップ

投稿2017/09/03 08:57

編集2017/09/03 09:15

オライリー・ジャパン社の提供する
Javascript 第6版 2016年8月19日 初版6刷発行
著者 David Flanagan
訳者 村上 列
発行人 ティム・オライリー
印刷 日経印刷株式会社

の書籍内、3章 型、値、変数におきまして
以下のような説明がなされております。

・・・(前略)JavaScriptでは関数スコープが使われるので、関数中で宣言された変数はすべて、関数全体からアクセスできます。面白いことに、変数宣言より前のコードからもアクセスできます。このJavaScriptの特徴のことは、公式用語はありませんが、ホスティング(巻き上げ)と呼ばれています。・・・(後略)

そこで、言葉通り以下のコードを書くと
console上、" i is not defined"とエラーが出力されいます。
文言通り読めば、それがローカルスコープであっても関数全体においては参照可能であり、また、それが例え、後で定義または宣言された変数であってもと読めるのですが
理解に誤りがあるのでしょうか?

どなたかご教示をいただければ幸いです。
*引用等で不備があればご指摘ください。

JavaScript

1 <script> 2 3 function dog (){ 4 document.write(i); 5 } 6 7 dog(); // "i is not defined.... 8 9 function cat (){ 10 var i ="にゃ〜"; 11 } 12 13 14 </script>

もし同一関数内のことのみを意味していたとしても
下記の通り、undefinedです。

Javascript

1function cat (){ 2 document.write(i);//undefined 3 var i ="にゃ〜"; 4 }

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

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

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

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

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

kei344

2017/09/03 09:07

「それ俺のローカルスコープ出会っても」はタイプミスでは。
SugiuraY

2017/09/03 09:16

ご指摘有難うございます。修正致しました。
guest

回答2

0

ベストアンサー

まず、JavaScriptでは、関数のローカル変数を他の関数で使うことはできません。「関数全体」は、同じ関数を意味しています。

面白いことに、変数宣言より前のコードからもアクセスできます

とありますが、初期値の代入は宣言した場所で行われます。同じ関数内で、宣言した場所より前で値を取得するとundefinedになります。

javascript

1var i = 3; 2 3function foo(){ 4 console.log(i); // undefined(3でも7でもない) 5 var i = 7; 6}

なお、constletでは挙動が違い、宣言した場所より上で使用しようとするとReferenceErrorとなりまうs.

投稿2017/09/03 10:36

編集2017/09/03 10:39
maisumakun

総合スコア145183

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

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

SugiuraY

2017/09/03 11:27

ご回答ありがとうございます。 理解することができました。 つまり、変数として宣言していないものを同じ関数スコープ内で先に使用してもエラーとはされずにunidentifiedになるとことと思います。 重ねてで申し訳ございませんが、 1) このような機能、仕様となっているため、何か便利な点があるのでしょうか?またはエラーにならないため、我々に警鐘を鳴らしているのでしょうか? 2) また、同じことを関数内ではなくグローバルオブジェクトにおいて実行してみたのですが同じようにundefinedとなり、結果は変わりませんでした、従ってこのホイスティングと呼ばれる機能は必ずしも関数スコープの中だけの話ではないと理解しても良いものでしょうか? ご存知であれば、この点だけご教示いただけると嬉しいです。 よろしくお願い申し上げます。
guest

0

var キーワードの有無によるはずです。

関数の中で宣言された変数に var キーワードが指定されている場合、その変数のスコープは関数の中だけになるはずです。var キーワードが指定されてない場合はグローバルとなりますが、関数が実行されるまでは undefined のままとなるはずです。

一方、グローバルスコープで宣言された変数は var キーワードの有無にかかわらず常にグローバルになるはずです。

【PS】

上記は、マイクロソフト公式解説書「プログラミング ASP.NET MVC」に書いてあったことの受け売りです。すべてのブラウザで試したわけではないので「はず」という表現になってます。もし、動作が違うということがあったらすみません。

投稿2017/09/03 09:18

編集2017/09/03 09:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SugiuraY

2017/09/03 09:33

コメント有難うございます。 コメントはvar宣言の有無による、ローカルまたはグローバル変数への影響かと存じます。 私の質問が不明瞭で申し訳ないですが、意図としては、関数スコープ内で変数宣言する前でも機能するようなホイスティングと呼ばれる仕様または、機能について、記述とは異なるのでは?という点になります。 宜しくお願い申し上げます。
退会済みユーザー

退会済みユーザー

2017/09/03 09:41

> そこで、言葉通り以下のコードを書くと ホントに「言葉の通り」コードを書いてますか? 質問に書いてあるコード(cat で定義した i を dog で参照する)は私のレスのことを言っているように思うのですが? 本に書いてあることは関数内での話(cat 内で定義した i を cat 内で参照する)のような気がしますけど。自分はその本は持ってないので分かりませんが。
SugiuraY

2017/09/03 11:21

コメントありがとうございます。 おっしゃるサイトの通りです。 また、maisumakun様がご指摘のように、ここでいう関数全体というのは、同じローカルスコープの範囲内であるということのようです。 書籍からそこまで読み取れず、申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問