JavaScriptの変数についての質問

このQ&Aのポイント
  • JavaScriptの変数に関する質問です。詳細なソースコードが提示されており、エラーについて説明があります。
  • 質問内容は2点あります。まず、セミコロンがない場合の理由について疑問を持っています。また、即時関数内で宣言せずに変数を使うことについても解説があります。
  • 最後に、回答を求めています。セミコロンの有無や変数のスコープについての説明を希望しています。
回答を見る
  • ベストアンサー

JavaScriptの変数について

JavaScriptのソースで解らないところがあり、困っています。 ソースは下記の様なものなのですが、エラーが出ていません。 解らない点は2点有ります。 1. jにfalseを代入している箇所なのですが、セミコロンがないのは何故なのでしょうか? Chromeのデベロッパツール, FireFoxのFirebugで確かめてみたのですが、エラーとなっておらず、alertでfalseと表示されている状態です。 「j = !1」の箇所を即時関数の外に出すと、エラーとなります。 普通変数に代入する式の末尾はセミコロンをつけると思うのですが、 何故なのでしょうか? 2.また、jはvar j等のように変数の宣言をせずに使えているようなのですが、 普通即時関数内で宣言した変数のスコープは関数の外では使えないので、エラーとなると思うのですが、宣言せずに代入に使った変数はグローバル変数と解釈されるのでしょうか? どなたかお答え下さい。 --------------------------------- <script> (function() { j = !1 })(); alert(j); </script>

質問者が選んだベストアンサー

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.2

#1 です。 http://okwave.jp/qa/q7220411.html との兼ね合いを考えると #1 が適切な説明ではなかったので補足します。 自動セミコロン挿入は改行もしくは "}" で区切られ、構文上有り得ない記述が後続する場合に働きます。 http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/7_Lexical_Conventions.html#section-7.9 var hoge = 1 // "1 var" は有り得ないので改行の後ろにセミコロンを挿入する var foo = 2; alert(hoge); // 1 q7220411 のようにわかりにくい部分もあるので、やはり避けるのが堅実かと思います。

hwbigin
質問者

お礼

そうですねー。おっしゃるとおりとおもいました。 ただ、サンプルコードや他人のコードを見ているとセミコロンのない代入ステートメントを良く見かけるもので 一応理解しておかないとと思いまして。 おかげ様で一応の理解はできたと思います。 大変有難うございました。

その他の回答 (1)

  • think49
  • ベストアンサー率59% (285/482)
回答No.1

var キーワードで変数宣言を行わない場合、グローバル変数として初期化されます。 ちなみに、ECMAScript 5 から導入された Strict Mode では "Uncaught ReferenceError: j is not defined" のエラーとなり、変数の初期化が無効となります。 http://jsfiddle.net/qb5hW/ JavaScript ではセミコロンを自動的に挿入される機構があるため、省略することも可能です。 具体的にはコード文末尾の改行の後ろにセミコロンがあるかのように扱われます。 コード圧縮器との相性が悪いのと可読性を損なう欠点があるのでお勧めはしませんが…。

関連するQ&A

  • JavaScriptのステートメントの考え方

    JavaScriptのステートメントの考え方で質問です。 JavaScriptでは行の終わりがステートメントの終わりと解釈されるはずなので、 下記の様なコードはOKですよね。 ------------------------------------------------------------------ <script>   j = !1   alert(j); </script> ------------------------------------------------------------------ しかし下記のコードだと「1 is not a function」とfirebugのコンソールで怒られます。 即時関数(function un(){})(); のところで怒られているようです。 ------------------------------------------------------------------ <script> j = !1 (function un(){ var i = 0; })(); alert(j); </script> ------------------------------------------------------------------ コンソールの文言はさておき、j = !1;としたら通ったので、おそらく ステートメントの終わりとして認識されてなかったのだなとおもいます。 un(){}の様に普通の関数にしたら通りました。 即時関数の直前だからダメなのでしょうか? どなたか、ご指南お願いいたします。

  • javascript無名関数から変数にアクセス

    お世話になります。 javascript初心者です。 無名関数からグローバル変数にアクセスしたいのですが 外で変数を宣言して、内でvar無しで代入してみたのですがうまくいきません どのようにすれば期待する結果になるのか、お忙しい中恐縮ですが 詳しい方お教えいただけないでしょうか //グローバル変数 var hoge; //dataTransfer処理省略 //html5のFileReader var reader = new FileReader(); reader.readAsDataURL(file); //ロードが完了したら無名関数にてhogeに結果を代入 reader.onloadend = function(e) {  hoge = e.target.result; }; alert(hoge); ■期待する結果 アラートで「結果」が表示される ■実際の結果 アラートで「」(空白)が表示される 無名関数内でalert(e.target.result);するとちゃんと結果が表示されるので FileReaderの処理は成功している模様です。 無名関数からグローバル変数にアクセスする方法を御存知の方 お教えいただけたら幸いです

  • javascriptで、下記のコードをFireFoxで実行した際にd(

    javascriptで、下記のコードをFireFoxで実行した際にd("input")の行でエラーが出てしまいます。 <script language="javascript"> var a=window.alert; alert(a); a("test"); var d=document.createElement; alert(d); d("input"); </script> なぜ、window.alert関数はa変数に代入して実行できるのに、document.createElementはd変数に代入しても実行できないのでしょうか。 d変数をalertすると[native code]とアラートされるので、関数を d に代入出来てはいそうなのですが。 ちなみにFireFox3.5.11で発生した現象です。

  • 変数の宣言をグローバルにしないと変数の参照が出来ま

    変数の宣言をグローバルにしないと変数の参照が出来ません。 ソース全体はカプセル化のために即時関数で囲っています。 function found内で小数点第三位までで四捨五入するようにする処理が共通なので関数化したのですが、 var gramNumを外で宣言しないと参照できずにgramNumが定義されていないと出てしまい困りました 関数スコープの影響だと思い宣言を外に出したのですが、それでも定義されていないと出て、 最終的にグローバル変数にしてやっとうまくいきました。 スコープは自分より上のスコープの変数は参照できるようですが if(xGramEmptyFlag === true) {ないの式がroundの上にあるvar gramNumを参照する場合、 if分の中にある式の一つ上のスコープなので参照できると思ったのですがなぜできないのでしょうか? varはブロックスコープがないので一つ上ではなく同じスコープにあることになるのでしょうか? ただその場合も同じスコープの変数は参照できるのではないのでしょうか?

  • JavaScriptで特定の変数に値が代入されるのを禁止する。

    JavaScriptで、既存の変数に値を代入し、その後の上書き(その変数への値の代入)を禁止するにはどのようにすればよいでしょうか。 <script type="text/javascript"><!-- var hoge = "hogeは初期化されてます"; hoge = "hogeは変更されました";//ここ以降での変更(代入)を禁止したい。 hoge = "hoge変更2回目"; alert(hoge); //--></script> というスクリプトを書いたときに、alert(hoge)で「hogeは変更されました」と表示させたいのです。 他の方法は駄目です。この方法だけでお願いします。 よろしくお願いします。

  • 変数について

    <scitp>の中(関数の中じゃない)で初期化した変数は、 ほかの<script>の中でも有効で var x;と宣言しても有効。 関数の中で初期化した変数は同じ<script>の中ならどの関数にも有効で、 var x;と変数宣言した場合は、その関数の中でのみ有効。 この解釈で正しいですか?

  • javascriptで困っています。教えてください

    新JavaScript例文辞典のJSONデータを解析して読み込む http://www.openspc2.org/reibun/javascript2/JSON/parse/0001/ を参考にjsonを扱うことを勉強してるのですが、以下のようにすると、関数の中の変数n,pには、読み込んだ値が代入されているのですが、関数の外の変数nには値がなくなり、変数pには代入されています。原因が分からず困っています。よろしくお願いします。 <!doctype html> <html> <head> <meta charset="utf-8"> <title>無題ドキュメント</title> <script type="text/javascript"> var n; var p; httpObj = new XMLHttpRequest(); httpObj.open("get", "jsondata.txt", true); httpObj.onload = function(){ var myData = JSON.parse(this.responseText); n = myData.item[0].itemName; p = myData.item[0].itemPrice; alert("関数の中のn="+n); alert("関数の中のp="+p); } httpObj.send(null); alert("関数の外のn="+n); alert("関数の外のp="+p); </script> </head> <body> </body> </html> ---------------------------------------------------------- 【JSONデータ:jsondata.txt】 {"item":[ { "itemCode":91, "itemName":"塩ラーメン", "itemPrice":300}, { "itemCode":94, "itemName":"味噌ラーメン", "itemPrice":290}, { "itemCode":95, "itemName":"豚骨ラーメン", "itemPrice":320} ] }

  • HTML id名とjavascript変数名

    <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>test</title> <script type="text/javascript"> window.onload = function() { console.log('test' in window); test.addEventListener('click', function() { alert('click') }, false); }; </script> </head> <body> <div id="test">test</div> </body> </html> 何かすごい勘違いをしていたらお恥ずかしいのですが、 上のコードFIREFOX以外(IE、Chrome、safari)'true'でtestをクリックするとalertが 出るのですが、これって自動的にid名がグローバル変数になってるって ことなのでしょうか?? id名と同じ名前で変数を宣言していて、ぶち当たりました。 どうぞよろしくお願いいたします。

  • JavaScriptからsetVariable()で変数が設定できない。

    Flash 4 を使用しています。 次のようなコードでJavaScriptからFlashに変数を渡すようにしているのですが、ブラウザによってはsetVariable()の行でJavaScriptの実行が停止してしまいます(前後にalert()を入れて確認しています)。 <head> <script type="text/javascript"> <!-- function myFunc() { var jsVar = "sample"; document.myFlash.setVariable("flVar", jsVar); } // --> </script> <body onLoad="myFunc()"> <object id="myFlash" ※以下中略。Flash表示用のコードが入る。 </object> </body> ところで、具体的には、 A:Firefox 1.5、Safari 2.0 ……常にうまくいかない。 B:Opera 8.5 ……うまくいくときもある。 という状況で、Aだけであればブラウザ依存の問題で片付けるところなのですが、Bから、Flashの読み込みのタイミングに問題があって、setVariable()実行時にFlash側の変数が見つけられないところからエラーになるのではないかと仮説を立てました。 しかし、onLoadでJavaScriptの関数を呼ばず、Flashの読み込みが完了した頃合を見計らってフォームのボタンから手動でmyFunc()を呼び出すようにしても、やはり当該箇所でJavaScriptが停止してしまいます。 なお、Flashの方は50KBほどのサイズで、フレームレートは12fps。変数flVarは最初のフレームのアクションで使用しています(宣言はしていません)。 どのような問題があると考えられるでしょか? また解決方法にはどのようなものがあるでしょうか?

    • ベストアンサー
    • Flash
  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

専門家に質問してみよう