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

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

新規登録して質問してみよう
ただいま回答率
85.37%
スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

3回答

813閲覧

Javascriptのletについて

kahosayshello

総合スコア4

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2020/05/31 04:08

閲覧いただき、ありがとうございます。
現在、独学でJsを勉強しております。
最近はじめ、グローバルスコープ、ローカルスコープ
(関数スコープ・ブロックスコープ)について調べていたところ、
下記のブログにたどり着きました。

https://qiita.com/wannabe/items/b2a0d63fc786eab13c48

上記ブログの「let(変数)」の章で下記のコードが示されていますが、
このコードの6行目から13行目の、x=3;で
ブロックスコープの中で、letをx=3;と再代入しているにも関わらず、
ブロックスコープ外の下の部分で、console.log(x);で3が出力されていることの理由がわからず、
お聞きさせていただきました。

Js

1function(){ 2 let x = 0; 3 console.log(x); //0 4 let x = 1; //error x has already been declared 5 console.log(x); //0 6 x = 2; 7 console.log(x) //2 8 if (true){ 9 console.log(x); //2 10 x = 3; 11 let y = "a"; 12 } 13 console.log(x); //3 14 console.log(y); //error y is not defined 15} 16 17function (){ 18 console.log(x); //x is not defined 19}

お分かりの方、ご教授いただけますと幸いです!!
お手数ですが、宜しくお願いいたします。

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

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

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

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

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

guest

回答3

0

ブロックスコープ外の下の部分で、console.log(x);で3が出力されていることの理由がわからず、

理解が間違ってます。

2行目でlet x = 0;で「宣言」されているので、この宣言文が含まれる{}の中がスコープになります。
そのため、13行目でxを参照できます。この時のスコープの範囲は2から14行目です。

9,10,13行目でxに値を代入したり参照したりするのは、スコープの中なので当然可能です。

投稿2020/05/31 04:19

編集2020/05/31 04:20
gentaro

総合スコア8947

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

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

kahosayshello

2020/05/31 05:12

ご回答ありがとうございます!あるスコープでした宣言にあたるものだけが、 そのスコープ外からアクセスできないということですね! なので、再代入(x)の場合は、スコープの宣言がこの関数スコープ全体からアクセス可能なため そのさらに内側のブロックスコープの中で再代入した場合でも、 外側の親のスコープとして代入されるということですね?>< なん度もすみません><
gentaro

2020/05/31 05:44

たぶん「宣言」と「代入」の違いを理解されてないんでしょう。 スコープは「宣言」で決まります。
guest

0

スコープチェーン というものがあります。

【#スコープチェーン | 関数とスコープ · JavaScript Primer #jsprimer】
https://jsprimer.net/basic/function-scope/#scope-chain

投稿2020/05/31 04:23

kei344

総合スコア69583

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

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

kahosayshello

2020/05/31 05:13

ありがとうございます!読ませていただきます><
guest

0

スコープというのは、"変数の値"の範囲ではなく、"変数そのもの"の範囲です。
変数を、「箱」という例えをすると、
2行目でxという箱を用意し、10行目でその箱に3を代入します。
箱の存在自体は変化しない(xの箱のスコープはfunctionのため)ので、13行目にいくと、箱に入っている"3"が返される、ということになります。

逆に、11行目では、
yという箱を用意しますが、その箱はif文のスコープ内でしか効果がないので、12行目で破棄され、14行目では存在していない箱となり、エラーになります。

投稿2020/05/31 04:19

yuuyu

総合スコア1139

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

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

kahosayshello

2020/05/31 04:36

ご回答ありがとうございます!>< 箱の中にさえあれば、ブロックスコープ({})(8行目)のなかで再代入していたとしても、その大きな箱の中全体に反映されてしまうということですか? では、8行目の中でだけ、再代入したい時はどのようにすればいいのでしょうか?
yuuyu

2020/05/31 05:00

xにこだわる理由がなければ別の変数を用意すれば事足ります。 もしxにこだわる場合は、即時関数を利用することで擬似的なものは作成できます。
kahosayshello

2020/05/31 05:06

なるほど、そういうことですね! ありがとうございました!!????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問