• 締切済み

このJavaScriptソースを解説して下さい

JavaScript勉強中です。とあるサイトのソースの一部なのですが 何が書いてあるのかわかりません。 どなたか解説してください。 ----------ソースここから---------- <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-23877599-2']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script> ----------ソースここまで---------- 全体的にわからないのですが、1行目だけでも教えてください。 var宣言で、論理和?(||)が使われてて、さらに配列?らしき括弧が続いてます。 これはなんという構文なのですか?

みんなの回答

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.3

無名関数は内部にスコープを作るため、 カッコで囲むのは関数宣言ではなく関数式として評価させるため

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

a || b はaがtrueに評価できるならa、false評価できるならbを返します よくtrueかfalseかを返すものだと勘違いされますが間違いです if文中等に使った場合は返された値がtrueかfalseかに評価されてるだけです つまり x = a || b は if(a){ x=a }else{ x=b } と同じ事です また、var文がどこに書いてあっても変数は未定義の場合は必ず一番にundefinedで初期化されるので x=1 x=2 var a = b x=3 x=4 は スコープが作られることを除けば if(typeof a == "undefined"){a = undefined} x=1 x=2 a = b x=3 x=4 と同じです よって var a = a || [] はもしaがnullやundefinedなどfalseに評価される値だったときxに[]が入ります もしaが配列だったりtrueに評価される値だったときxにaが入ります aが未定義の場合はvarが無ければエラーになりますがvarがあればa = undefinedになっているのでxに[]が入ります 要は var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-23877599-2']); _gaq.push(['_trackPageview']); の2、3行目で配列に値を追加していますが、 1行目で _gaq = []などとしてしまうと もしも実行時に他の部分によって既に_gaqに配列が作られていても初期化されてしまいそれに追加したくてもできません しかし何もしないと、もし_gaqが配列で無ければ2行目でエラーが出てしまいます 「_gaqを空配列で初期化したいがもし既に配列が代入されていればそのままに」 を簡潔に表現したのが1行目です これをif文で表現しようとすると if(typeof _gaq == "undefined"){_gaq = undefined} if(_gaq){ _gaq = _gaq }else{ _gaq = [] } みたいに長くなってしまいますが varと||の特性を活かすことでとても短くなるのです

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>var _gaq = _gaq || []; 個の場合の、[]というのは、new Array();と同義 _gapが宣言されていればそのまま、宣言されていなければ空配列を_gapに代入 ようは_gap変数を配列に初期化しているということでしょうね

trap1130
質問者

お礼

ありがとうございます。 理解できました。 JavaScriptは書き方の自由度が高いのですね。

trap1130
質問者

補足

1行目は理解できました。 次の質問なのですが、無名関数が (function(){ ~ })(); このように括弧で囲んであるのはなぜでしょう? さらに言えば、なぜfunctionにしているのでしょうか? そのまま(functionの中身のコードを)書いても良い気がするのですが・・・