JavaScriptの変数のスコープって? [Javascript]

このエントリーをはてなブックマークに追加

質問:

javascriptの変数のスコープってどうなってる?関数の中と外で同じスコープを持ってる?それとも違う?
また、グローバルに定義されている場合、変数はどこに格納されるの?

By lYriCAlsSH | 質問日時: 2009年2月1日 8:27



回答1:

君が勉強するためにベストなのは例をたくさん与えることだと思う。
Javascriptのプログラマーは、どれくらいスコープを理解しているかによって実質的にランク付けされてるからね。
時には、スコープは直感に反することもあるけど。

1.*グローバルスコープの変数*

var a = 1;
// global scope
function one() {
alert(a); // alerts '1'
}
  1. ローカルスコープ
var a = 1;
function two(a) {
alert(a); // '1'のグローバル値ではなく、指定された引数に警告する。
}
// ローカルスコープ
function three() {
var a = 3;
alert(a); // '3'を警告
}
  1. 中級:JavaScriptにブロックスコープなんてものは存在しない(ES5; ES6では letが導入された)

a.

var a = 1;
function four() {
if (true) {
var a = 4;
}
alert(a); // '1'のグローバル値ではなく、4を警告
}

b.

var a = 1;
function one() {
if (true) {
let a = 4;
}
alert(a); // 'let'キーワードがブロックスコープを使用するため、'1'を警告
}

  1. 中級**:Objectプロパティ
var a = 1;
function five() {
this.a = 5;
}
alert(new five().a); // alerts '5'
  1. 上級Closure
var a = 1;
var six = (function() {
var a = 6;
return function() {
    // JavaScriptで "closure"はここの'a'にアクセスできることを意味する
    //なぜなら定義した関数内で定義されているから。
alert(a); // alerts '6'
};
})();
  1. 上級**:プロトタイプベースのスコープ解決
var a = 1;
function seven() {
this.a = 7;
}
// [object].prototype.property はルックアップチェーン内の
// [object].property に失われる。例えば...
//上記のコンストラクタで 'a'が設定されているため、到達しない。
seven.prototype.a = -1;
//コンストラクタで 'b'が設定されていなくても、到達する。
seven.prototype.b = 8;
alert(new seven().a); // alerts '7'
alert(new seven().b); // alerts '8'

  1. グローバル+ローカル必要以上に複雑なケース
var x = 5;
(function () {
console.log(x);
var x = 10;
console.log(x);
})();

undefined10 'ではなく5 10`を出力。JavaScriptは変数宣言(初期化ではない)を常に先頭に移動し、以下のコードと同等になる。

var x = 5;
(function () {
var x;
console.log(x);
x = 10;
console.log(x);
})();
  1. キャッチ節のスコープを持つ変数
var e = 5;
console.log(e);
try {
throw 6;
} catch (e) {
console.log(e);
}
console.log(e);

これは 565を出力する。 catch節はeはグローバルにもローカル変数にも影響を持つ。でも、この特別なスコープはキャッチされた変数に対してのみです。var f;をcatch節の中に書くと、try-catchブロックの前または後に定義した場合とまったく同じ。

By Triptych | 回答日時: 2009年2月1日 8:58



Source: What is the scope of variables in JavaScript?

共有 コメント