JavaScriptでグローバル変数のスコープについて質問です


関数の中でグローバル変数を宣言する場合、
スコープで外からはアクセスできないですが、
他の使い方があるのでしょうか?

<script type="text/javascript">
function check() {
x = 1;
}

document.write(x);
</script>

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/19 18:26:59
  • 終了:2010/03/22 19:20:26

ベストアンサー

id:Km1967 No.3

Km1967回答回数224ベストアンサー獲得回数352010/03/19 19:40:06

ポイント20pt

グローバルかローカルかで内部的には扱いが変わってくるのだが、表向きではあまり変わらんのがjavascriptのグローバル変数とローカル変数。極端な話だが利用者がルーチン内でvar宣言したものがローカルとして区別されるだけと考えても良いだろう。

http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs03/ajaxjs03_03.ht...


だが、ひとたびルーチン内でローカル宣言せずに変数を使ってしまえばグローバルと値が混在してしまうなどの恐れがあるからして、ルーチン内でのvar宣言は基本的に必須事項となる。宣言せぬのは無知か(宣言せずとも混乱せぬ場合の)手抜きだと言う事。

コードの再利用なども考えずに何かトリッキーな事(関数を通った時だけ変数が存在するとかだが、用途が浮かばん)でもやろうとしていない限りは必要性などない。ルーチン内でグローバル変数を利用するなとは誰も言わぬが混乱の元だ。

id:pochi1234

なるほど!とてもわかりやすい説明ありがとうございました。

関数内では混乱を避けるため、グローバル変数を宣言しないようにします。

2010/03/19 20:27:28

その他の回答(4件)

id:Km1967 No.1

Km1967回答回数224ベストアンサー獲得回数352010/03/19 18:40:48

ポイント20pt

http://rfs.jp/sb/javascript/01/04.html

変数には『グローバル変数』と『ローカル変数』があります。どこからでも参照することが可能な変数をグローバル変数、有効な範囲を決められている変数をローカル変数と呼びます。JavaScriptでは、関数内で var を付けて変数宣言すると、その変数はローカル変数となり、var を付けない場合はすべてグローバル変数になります。

変数の宣言は必ずしも必要ではありません。ただし、使用する前に変数を宣言しておくのがよいプログラミング作法とされています。変数の宣言にはvarステートメントを使用します。

javascriptは宣言無しで変数を使えるから無知か手抜きのどちらかだろう。

id:pochi1234

そんな簡単なことではなくて、関数の中でグローバル変数を使う必要性が知りたいのです。

2010/03/19 19:15:03
id:Bombastus No.2

ホーエンハイム回答回数409ベストアンサー獲得回数522010/03/19 18:55:13

ポイント20pt

スコープで外からはアクセスできないですが、

この文言の意味がよく分かりません。

たとえば下記のようなスクリプトであれば、x+2の結果がきちんと表示されます。

<script type="text/javascript">
function check() {
    x = 1;
}
check();
document.write(x + 2);
</script>

http://rfs.jp/sb/javascript/01/04.html

id:pochi1234

関数の中でグローバル変数を使う必要性がないと言うことなのでしょうか?

関数内でグローバル変数にしても、ローカル変数と同じじゃないのかということです

2010/03/19 19:17:07
id:Km1967 No.3

Km1967回答回数224ベストアンサー獲得回数352010/03/19 19:40:06ここでベストアンサー

ポイント20pt

グローバルかローカルかで内部的には扱いが変わってくるのだが、表向きではあまり変わらんのがjavascriptのグローバル変数とローカル変数。極端な話だが利用者がルーチン内でvar宣言したものがローカルとして区別されるだけと考えても良いだろう。

http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs03/ajaxjs03_03.ht...


だが、ひとたびルーチン内でローカル宣言せずに変数を使ってしまえばグローバルと値が混在してしまうなどの恐れがあるからして、ルーチン内でのvar宣言は基本的に必須事項となる。宣言せぬのは無知か(宣言せずとも混乱せぬ場合の)手抜きだと言う事。

コードの再利用なども考えずに何かトリッキーな事(関数を通った時だけ変数が存在するとかだが、用途が浮かばん)でもやろうとしていない限りは必要性などない。ルーチン内でグローバル変数を利用するなとは誰も言わぬが混乱の元だ。

id:pochi1234

なるほど!とてもわかりやすい説明ありがとうございました。

関数内では混乱を避けるため、グローバル変数を宣言しないようにします。

2010/03/19 20:27:28
id:Bombastus No.4

ホーエンハイム回答回数409ベストアンサー獲得回数522010/03/19 19:40:27

ポイント20pt

関数内でグローバル変数にしても、ローカル変数と同じじゃないのかということです

No.2で回答した者です。

No.2の回答をもう一度ご覧下さい。

関数内でグローバル変数を定義し、関数外でそれを参照しています。

グローバル変数だからこういうことができるわけです。関数内ローカル変数とは違います。

http://q.hatena.ne.jp/1268990817#a1001797

id:pochi1234

失礼しました。

グローバル変数にアクセスできていますね。

2010/03/19 20:30:46
id:ko8820 No.5

ko8820回答回数1221ベストアンサー獲得回数692010/03/19 20:14:53

ポイント20pt

>そんな簡単なことではなくて、関数の中でグローバル変数を使う必要性が知りたいのです。

スクリプトだからですね。

グローバル変数使うほうが速度も速いし、スタック(メモリー)も使わないし

構文解析も簡単だしということです。

プログラム的にみれば、あまり良い書き方ではないですが

所詮、スクリプトという位置づけなので。

>関数内でグローバル変数にしても、ローカル変数と同じじゃないのかということです

Ajaxとかその他もろもろのように、Javascriptがこんなにハードに使われることを

設計時(実装時)は考慮してなかったということですね。

またスクリプトなので、インタープリタ的に動作するので、同じではないですね。

http://q.hatena.ne.jp/answer

id:pochi1234

わかりやすい説明ありがとうございます。

2010/03/19 20:33:08
  • id:pochi1234
    メソッド内でグローバル変数を使用するべきではないです。
    変数のスコープチェーンを知ることでよく理解できました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません