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

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

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

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

Q&A

解決済

3回答

1694閲覧

変数の巻上げはグローバルスコープでは発生しない?

re97

総合スコア208

JavaScript

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

0グッド

0クリップ

投稿2016/05/01 10:59

編集2016/05/01 10:59

変数の巻上げはグローバルスコープでは発生しないのでしょうか?
・var付与することは、変数の巻上げを発生させるための必要要件?

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

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

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

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

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

guest

回答3

0

ベストアンサー

気になったので、実際にやってみました。

JavaScript

1console.log(global_v); 2var global_v = "global"; 3console.log(global_v);

この出力は、

undefined global

となりました。よって、巻き上げのような事が、グローバル領域でも発生しているという事になるかと思います。

さらに、

JavaScript

1'use strict'; 2console.log(global_v); 3var global_v = "global"; 4console.log(global_v);

としましたが、'use strict'モードでも、変数無いよエラー、は、でませんね。
一応、再度確認、

JavaScript

1'use strict'; 2console.log(global_v); 3var global_v = "global"; 4console.log(global_v); 5 6console.log(test);

このようにすると、

__test__.php:24 Uncaught ReferenceError: test is not defined

が、でますね。

ということで、
グローバル領域でも、変数の巻き上げは起こっているということで、よいかと思います。

検証環境:Chrome 50

投稿2016/05/01 14:15

ItoTomonori

総合スコア1283

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

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

re97

2016/05/02 01:39

・回答&検証ありがとうございました ・参考になりました
guest

0

とりあえず、変数の巻き上げについては以下に書いてあります。

知らないと怖い「変数の巻き上げ」とは?

投稿2016/05/01 11:53

kentei_syunrai

総合スコア946

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

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

re97

2016/05/02 01:35

・回答ありがとうございました >JavaScriptでは、関数内で宣言されたローカル変数は、すべてその関数の先頭で宣言されたものとみなされる ・関数外で宣言した場合はどうなるのでしょうか?
guest

0

グローバル空間において、代入された値の参照については、巻き上げが起こるのは関数宣言式であり、varで宣言した変数の巻き上げは起こらない。
varに代入した無名関数も巻き上げは起こらず、宣言した後でないと利用できません。

…あれ、違ったかな。

投稿2016/05/01 15:42

編集2016/05/01 16:06
DaisukeSakai

総合スコア50

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

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

re97

2016/05/02 01:38

・回答ありがとうございました ・グローバル空間では、変数の巻き上げは起こらないということでしょうか?
DaisukeSakai

2016/05/02 02:46

上記の方がテストコードを書いていますが、var宣言は値の参照について巻き上げは起こりません。
think49

2016/05/03 02:32

To: DaisukeSakai さん 変数の巻き上げ(Variable Hoisting)の認識に齟齬があるように思われます。 一般に変数の巻上げとは var 宣言前に変数が undefined で初期化される動作を指します。 https://www.google.co.jp/search?q=variable+hoisting+javascript ES5.1 には hoisting という単語はなく、ES6 で始めて hoisting の表現が使われましたが、本当に巻き上げられているわけではなく、初期化のタイミングが先に来るだけです。 ただ、一般認識的には「変数の巻上げ」とは var 宣言前に undefined で初期化される動作を指します。 http://ecma-international.org/ecma-262/5.1/ http://www.ecma-international.org/ecma-262/6.0/ To: re97 さん 質問前にご自身で検証される事をお勧めします。 ItoTomonori さんがされたように検証してみれば結論が出た質問だと思いますが、どうでしょうか。 仮説を立てて検証し、自分の認識と違えば仮説を立て直して再検証を繰り返し、仮説と検証結果が一致した時、初めて自分の知識が得られると思います。
re97

2016/05/03 02:32

・コメントありがとうございました
think49

2016/05/03 03:31

私としては誠意を持って言葉を選んだ指摘にしたつもりですが、あたりさわりのない返答ですとあまり深く読まれてないのかと悲しくなってしまいますね…。
DaisukeSakai

2016/05/03 09:39 編集

コメント拝見しました。 巻き上げの具体的な動作のご説明ありがとうございます。 確かにundefinedが出力されることでも、それはわかります。 そのため、参照と付けたのは定義前でも、後から代入した値を参照できるか否か。という意味でつけました。 書いていただいた通り、それは巻き上げとは言いませんね。 ありがとうございます。勉強になりました、
re97

2016/05/04 01:46 編集

To: think49 さん >検証してみれば結論が出た質問だと思いますが ・事前に試してみたのですが結果に自信が持てなかったため、確認のため質問しました 確認のため質問した理由は以下の通りです ・理由1 … ブラウザで動作確認してもJavaScriptの場合は必ずしも正しいとは限らないため(以前、オブジェクトの並び順で苦労しました) ・理由2 … 検索してもこの件に関して言及しているページが見当たらなかったため。何か特別な事情があるのではないかと思いました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問