特集PC技術

コアJavaScript(ECMAScript)の図書室

 

27冊目 【JavaScript】[ECMAScript] 変数のスコープ

変数のスコープとはどの場所から参照することができるかどうかのことです。
C言語やJava言語などを学習してあると引っかかりやすい点もあります。

目次

[1] 変数のスコープは主に2種類ある

スコープには主にグローバルスコープとローカルスコープがあります。
グローバルスコープを持つ変数をグローバル変数といい、ローカルスコープを持つ変数をローカル変数といいます。
グローバル変数とローカル変数の違いは次の項目より説明をします。

[2] グローバル変数(var宣言しない)

グローバル変数とはグローバルスコープにより参照できる変数のことです。
グローバルとはプログラム全体から参照できることをさします。
var宣言をせずに変数を作成すればグローバル変数になります。

str = "PC特集技術";

function scope_output(){
	// 上に記述した変数と同じところを参照している
	str = "どんとこいPC情報";
	return str
}

document.writeln(str);

// 値が書き換わる
document.writeln(scope_output());

// 値は書き換わったまま
document.writeln(str);

2回目の出力は関数外に作成した変数の値を書き換えています。
3回目の出力は値を書き換えた値が出力されます。

[3] ローカル変数(var宣言する)

ローカル変数とはローカルスコープにより参照できる変数のことです。
ローカルとは特定の場所からのみ参照できることをさします。
一般的には関数内などです。
var宣言をして変数を作成すればローカル変数になります。


var str = "PC特集技術";

function scope_output(){
	var str = "どんとこいPC情報";
	return str
}

// 関数外の変数を参照している
document.writeln(str);

// 関数内の変数を参照している
document.writeln(scope_output());

// 関数外の変数を参照している
document.writeln(str);

グローバル変数の動作を比較すれば、違いがよくわかると思います。
1回目と3回目の出力は関数外に作成してある変数を参照していますが、
2回目の出力は関数内の変数を参照しています。

[4] 引数のスコープはデータ型により違う

引数のスコープとは関数で渡した変数に関するスコープです。
関数の基礎でも説明しましたが、データ型によって異なります。

var number = 100;
var array = [1,2,4,6];

function sum(number){
	return number *2;
}

function data_insert(array){
	array.push(10);
	return array;
}

// 基本型の場合
document.writeln(number);
document.writeln(sum(number));
document.writeln(number);

// 参照型の場合
document.writeln(array);
document.writeln(data_insert(array));
document.writeln(array);

[5] ブロックのスコープは存在しない

ブロックのスコープとは大括弧({})で囲まれたプログラムのスコープです
JavaScriptにおいて、ブロックのスコープは存在しません。
Java言語を学んだ人にはちょっと紛らわしい動作をします。以下のプログラムを見てください。

// Javaと動作が異なるので注意する
for(var i = 0; i <= 10; i++){
	document.writeln(i);
}
document.writeln("ここで変数iを表示してもエラーにならない"+i);

JavaScriptの変数はどこでも宣言をすることが可能です。
上記のプログラムでは、for文内に変数宣言をしていますが、for文を抜けた後でも変数は有効です。
JavaScriptの変数には{}内だけ有効という変数はありません。
勘違いする可能性もあるので、for文内で宣言するのはあまりいい方法とは思えません。
これ以外にも、もう1つ紛らわしいスコープがあります。

// 変数の宣言位置に注意する
function output(){
	// 変数strが宣言される前に表示してみると?
	document.writeln(str);
	var str = "PC特集技術";
	document.writeln(str);
}
output();

変数のスコープはどこで宣言しても最初に宣言したようにみなします。
JavaScriptの変数は、静的なスコープです。つまり定義時のスコープを参照しています。
スクリプト言語なので、逐次解析して実行しているのかと思いきや、このような現象が起こります。
関数内で宣言した場合それが、途中であっても既に宣言されているようにみなされます。
もし、var宣言された変数を記述しなかったときにはエラーになりますのでお間違えのないように。
動作などに余計な不具合を招きかねないので、変数は関数の先頭で宣言しておいたほうが無難です

[6] 更新履歴

日付 詳細
2011/08/12 コンテンツ公開

コメントの投稿


画像の中に見える文字を入力してください。

トラックバックURL

http://www.isl.ne.jp/cgi-bin/mt/mt-tb.cgi/1691

サイト内検索

コアJavaScript(ECMAScript)の図書室

twitterTwitter

最新ブログ記事

2015年06月13日

JavaScriptの情報室

4冊目 ハイブリッドアプリが作れる。tabris.js

2014年10月16日

C++言語学習録

第3回 ファイルを分割してみよう

2014年10月09日

C++言語学習録

第2回 オブジェクト指向の復習

2014年10月02日

C++言語学習録

第1回 C++の開発環境を整える

2014年09月25日

Swiftを試してみようなう。

第4回 Swiftでクラスを使うなう。

ISL 情報戦略研究所

pagetopこのページの先頭へ戻る