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

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

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

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

Q&A

解決済

3回答

308閲覧

入れ子にした関数の中で、var文を省略して変数を宣言した場合、どのように処理されるか

tter

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2018/02/05 02:13

編集2018/02/05 02:22

関数中で、var文を省略して変数を宣言すると、グローバル変数になると習いました。
自分でも試してみたところ、確かにそのようになりました。

しかし、入れ子にした関数の中で同じことをすると、
以下のように、var文を用いてローカル変数を宣言したかのような結果となりました。

a = 1; function f() { var a = 2; function nest() { a = 3; return a; } return [a, nest()]; } f(); // [ 2, 3 ] a; // [ 1 ]

これは、勝手にvar文が補完されているのでしょうか。

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

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

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

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

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

guest

回答3

0

ベストアンサー

最後の行がreturn [a, nest()]となっていますが、JavaScriptの式は左から処理されるので、先にもともとのa = 2を入れてからnest()を呼んで3に変化します。

投稿2018/02/05 02:29

maisumakun

総合スコア145184

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

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

tter

2018/02/05 02:36

なるほど…。 よく分かりました、ありがとうございました。
tter

2018/02/05 02:44

申し訳ないのですが、追加で質問しても良いでしょうか。 return [nest(), a]とひっくり返すと、結果が[ 3, 3 ]となりました。 後者の3は、グローバルとローカルのどちらの変数の値を返しているのでしょうか。
tter

2018/02/05 02:50

ありがとうございます。
guest

0

「関数中で、var文を省略して変数を宣言すると、グローバル変数になる」が正確でなく、
「関数中で、var文を省略して変数を使うと、その外側の関数でvarで宣言した変数になる。すぐ外側に無ければ、外側の外側と、順番に外側を見てもどこにもvarが無ければグローバルオブジェクトのプロパティとみなす」でしょうか。

関数の中で関数を定義する話がなければ、最初の文でも良いのですが。

投稿2018/02/05 07:17

otn

総合スコア84559

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

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

tter

2018/02/05 08:26 編集

なるほど…。順に見ていくのですね。 必ずしもグローバルオブジェクトのプロパティになるわけではないと。 腑に落ちた気がします。ありがとうございます。
otn

2018/02/05 11:22

あ、今はconstとかletとかもあるので、上記も正確じゃ無いですね。
guest

0

>function nest() {
> a = 3;
> return a;
> }

このa=3は、
>var a = 2;
で設定している2を3に書き換えているのではないでしょうか。

JavaScriptの「スコープチェーンをたどる」という仕様でしょうかね。
例えば、以下の記事:
スコープチェーン(静的スコープ)とクロージャ
https://qiita.com/Knbass/items/9c124560a58538d24729

これを踏まえると、
>return [nest(), a]とひっくり返すと、結果が[ 3, 3 ]となりました。
も予想通りの結果かと思います。

投稿2018/02/05 03:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tter

2018/02/05 03:12

やはり、その辺りが関係しているのですね…。 参考にさせていただきます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問