このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
js:function:scope [2021/04/05 11:24] tanaka 作成 |
js:function:scope [2021/04/19 14:20] (現在) tanaka |
||
---|---|---|---|
行 3: | 行 3: | ||
--- // | --- // | ||
- | <code javascript> | + | <sxh javascript; |
var variable = ' | var variable = ' | ||
- | | + | function func(arg) { |
var variable = ' | var variable = ' | ||
return `${arg} ${variable}`; | return `${arg} ${variable}`; | ||
} | } | ||
console.log(func(' | console.log(func(' | ||
- | console.log(variable ); // 出力:' | + | console.log(variable ); |
- | </code> | + | </sxh> |
+ | \\ | ||
- | === グローバル変数 === | + | ===== グローバル変数 |
* 関数の外でvarにより宣言された変数 | * 関数の外でvarにより宣言された変数 | ||
* varを使用しない全ての変数はグローバル変数として扱われる | * varを使用しない全ての変数はグローバル変数として扱われる | ||
- | ※ 変数とはvar又はletにより生成される。それらのないものはグローバルオブジェクトのプロパティとして扱われる | + | ※ 変数とはvar又はletにより生成される。それらのないものはグローバルオブジェクトのプロパティとして扱われる。 |
+ | \\ \\ | ||
- | === ローカル変数 === | + | ===== ローカル変数 |
* 関数内でvarにより宣言された変数 | * 関数内でvarにより宣言された変数 | ||
* 仮引数 | * 仮引数 | ||
- | ※ ローカル変数を作りたい時は常にvar \\ | + | ※ ローカル変数を作りたい時は常に |
※ ES2015以前はブロックスコープがなかった | ※ ES2015以前はブロックスコープがなかった | ||
- | 例 | + | <sxh javascript; |
- | <code javascript> | + | |
var myVariable = ' | var myVariable = ' | ||
| | ||
function func() { | function func() { | ||
console.log(myVariable); | console.log(myVariable); | ||
- | var myVariable; | + | var myVariable; |
return myVariable; | return myVariable; | ||
} | } | ||
| | ||
console.log(func()); | console.log(func()); | ||
- | </code> | + | </sxh> |
- | varの位置に関わらずmyVariableは関数内のどこでも常にローカルスコープを持つ \\ | + | '' |
- | ※ var myVariableをコメントアウトするとグローバルスコープを持つようになる \\ | + | ※ '' |
- | ⇒ 変数の巻き上げ(hoisting)と呼ばれる | + | ⇒ 変数の巻き上げ('' |
+ | \\ \\ | ||
- | ** ブロックスコープ< | + | ===== ブロックスコープ |
+ | < | ||
let(変数)又はconst(定数)によりブロックスコープを作る事ができる | let(変数)又はconst(定数)によりブロックスコープを作る事ができる | ||
- | 例 | + | <sxh javascript; |
- | <code javascript> | + | |
let i = 1; | let i = 1; | ||
var j = 1; | var j = 1; | ||
行 61: | 行 63: | ||
} | } | ||
console.log(`${i} ${j} ${c}`); | console.log(`${i} ${j} ${c}`); | ||
- | </code> | + | </sxh> |
+ | \\ | ||
+ | |||
+ | ===== Functionコンストラクタと関数リテラルのスコープ ===== | ||
+ | |||
+ | <sxh javascript; | ||
+ | var variable = ' | ||
+ | |||
+ | function func() { | ||
+ | var variable = 'Local Scope'; | ||
+ | var func1 = new Function(' | ||
+ | var func2 = function(){return variable}; | ||
+ | var func3 = () => variable; | ||
+ | |||
+ | console.log(func1()); | ||
+ | console.log(func2()); | ||
+ | console.log(func3()); | ||
+ | } | ||
+ | |||
+ | func(); | ||
+ | </ | ||
+ | |||
+ | Functionコンストラクタによるスコープはグローバルスコープを持つ。 | ||
+ | \\ \\ | ||
+ | |||
+ | ===== Callオブジェクト ===== | ||
+ | |||
+ | Call オブジェクト(Activation オブジェクトとも呼ばれる)は、関数が呼び出される度に内部的に自動生成されるオブジェクトです。関数の実行時に、引数とvar変数がCall オブジェクトに格納され、Arguments オブジェクトを参照するargumentsプロパティが生成されます。 | ||
+ | \\ \\ | ||
+ | |||
+ | ===== スコープチェーン ===== | ||
+ | |||
+ | スコープチェーンとは、グローバルオブジェクトとCall オブジェクトを連結したリストのことで、変数の名前解決のために使用されます。JavaScript は関数が呼び出されると、Callオブジェクトを生成しスコープチェーンの先頭に追加します。チェーンの最後にはグローバルオブジェクトが配置されています。 | ||
+ | |||
+ | JavaScript の変数の名前解決には、このスコープチェーンが利用され、チェーン先頭から末尾のグローバルオブジェクトまでが検索され、チェーンに含まれない変数は、未定義になります。 |