人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JavaScriptの練習をしています。以下のようなサンプルスクリプトを作成しました。
<script type="text/javascript">
<!--
var a = 5 ;
var b = 5 ;
function myFunc () {
var a = 100 ;
a+= 10 ;
b+= 10 ;
}
document.write("a=" + a + ":b=" + b + "<br>") ;
myFunc() ;
document.write("a=" + a + ":b=" + b + "<br>") ;
// -->
</script>

結果としては、
a=5:b=5
a=5:b=15
となるのですが、
・myFuncの関数内で改めて変数aとして100を宣言しているのに、結果に反映されていないのはなぜか?
・コード通りであれば、myFunc関数実行後は変数aもbも15になるはずなのに、変数aは5のままなのはなぜか?

と言う点について、どなたか解説をお願いいたします。

●質問者: Marin_MTB
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● nattow
●34ポイント ベストアンサー

myFunc 内で宣言した a は myFunc 内でのみ有効です。

myFunc 内で a を宣言しているので、myFunc の外で宣言した a は myFunc 内での宣言後は(一時的に)見えなくなります。

ですので、myFunc 内で行った演算 "a+= 10" は myFunc 内で宣言した a に対して行われ、myFunc の外で宣言した a には影響しません。

よって、最終的な結果は "a=5:b=15" となるのです。


Marin_MTBさんのコメント
この回答が一番ピンと来ました。そう言うことなんですね。 ありがとうございました。

2 ● きゃづみぃ
●33ポイント

変数のスコープの問題ですね。

http://archiva.jp/web/javascript/variable_and_scope.html

http://www.atmarkit.co.jp/fdotnet/ajaxjs/ajaxjs03/ajaxjs03_02.html

ここらへんを よく読んでみてください。


Marin_MTBさんのコメント
ありがとうございます。参考にさせて頂きます。

3 ● Lhankor_Mhy
●33ポイント

実行を追って説明するとこんな感じです。

var a = 5 ;
var b = 5 ;

window.aに5を代入。

window.bに5を代入。

document.write("a=" + a + ":b=" + b + "<br>") ;

window.aを参照して5を得る。

window.bを参照して5を得る。

function myFunc () {
var a = 100 ;
a+= 10 ;
b+= 10 ;
}

myFunc.aに100を代入。

myFunc.aに100+10を代入。

myFunc.bを参照するが存在しないので、window.bを参照。

window.bに5+10を代入。

document.write("a=" + a + ":b=" + b + "<br>") ;

window.aを参照して5を得る。

window.bを参照して15を得る。


Marin_MTBさんのコメント
丁寧な解説ありがとうございます。ようやく理解できました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ