変数の種類
記述 |
種別 |
意味合い |
let(※1) |
局所変数 |
let (変数 = 値) {}のブロック内でのみ変数が有効となる |
const(※2) |
定数 |
変数識別子への再代入をできないようにする。配列やオブジェクトは変更できるため、不変という意味ではない。 |
var(※3) |
ローカル変数とグローバル変数 |
通常の変数宣言だが、letが登場してからはスコープ範囲を制限する観点で使う機会が減少した |
(※1)<script type="text/javascript; version=1.7"></script>のようにバージョンを明記が必要。
(※2)constとすると定数を書ける。ただし、ECMAScript6で決まった仕様なので使用できるブラウザに制限がある模様。
(※)関数内でvarをつけた場合はローカル変数。
関数外でvarをつけた場合はグローバル変数として扱われる。
var hoge; //グローバル変数(=window.hoge)
function sample() {
var hoge; //ローカル変数(=sample.hoge)
}
Activation(Call)オブジェクト
関数のコールが発生した時に生成されるオブジェクト。プログラマ側からアクセスは出来ない。
function sample(){
var test = "hoge";
}
から以下のオブジェクトが生成される。
sample = {
test:'hoge', //変数オブジェクト
arguments:, //<-argumentsオブジェクト。関数の呼び出し元から渡された変数を格納(配列ではないが、Array.prototype.slice.call(arguments);で変換可能。
// callee:関数自身、caller:関数呼び出し元,length:引数の長さ等を持つ。
this:
}
スコープチェーン
基本的に変数は内側から優先されて、評価される。
with句(非推奨)➡内側のcallオブジェクト➡外側のcallオブジェクト(*1)➡グローバルオブジェクト(windowオブジェクト)
var hoge = "hoge";
function test() {
var hoge = "test"; //sample関数スコープでhoge変数を宣言しなかった場合は、test関数のスコープが参照される。
//function sampleの部分をxxx.onclick = function() {}のようにした場合は(*2)参照。
function sample() {
var hoge ="sample"; //sample関数スコープで宣言したhoge変数("sample")の方が優先度高い。
}
}
(*1)内側のcallオブジェクトのargumentsから外側のcallオブジェクトを辿るので、まるでチェーンのようだ…という意味。
(*2)
スコープ参照の注意
最終更新:2020年09月05日 12:55