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のままなのはなぜか?

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

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2011/10/20 13:46:59
  • 終了:2011/10/27 13:50:03

ベストアンサー

id:nattow No.1

nattow回答回数102ベストアンサー獲得回数272011/10/20 13:52:13

ポイント34pt

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

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

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

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

id:Marin_MTB

この回答が一番ピンと来ました。そう言うことなんですね。

ありがとうございました。

2011/10/30 13:50:20

その他の回答(2件)

id:nattow No.1

nattow回答回数102ベストアンサー獲得回数272011/10/20 13:52:13ここでベストアンサー

ポイント34pt

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

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

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

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

id:Marin_MTB

この回答が一番ピンと来ました。そう言うことなんですね。

ありがとうございました。

2011/10/30 13:50:20
id:taknt No.2

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/10/20 13:56:58

ポイント33pt

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

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

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

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

id:Marin_MTB

ありがとうございます。参考にさせて頂きます。

2011/10/30 13:50:55
id:Lhankor_Mhy No.3

Lhankor_Mhy回答回数779ベストアンサー獲得回数2312011/10/20 15:48:50

ポイント33pt

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

 

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を得る。

id:Marin_MTB

丁寧な解説ありがとうございます。ようやく理解できました。

2011/10/30 13:52:04

コメントはまだありません

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

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

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

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