約 1,438,140 件
https://w.atwiki.jp/mojavi_php/pages/7.html
mojaviの導入(その2)mojaviを使ったフレームワークの概念 mojaviを使う 「hello」というアクションの処理 「hello」アクションのに対するviewの処理 テンプレートの作成「defaultindex.tpl」 実行 少し発展 次回 mojaviの導入(その2) mojaviを使ったフレームワークの概念 右下のがクライアントからのアクセス。 クライアントがmojaviにアクセスしてくると、mojaviは「action」をおこします(①の部分)。 actionを実行すると、次にviewに移ります(②の部分) viewではクライアントに返すHTMLをテンプレートから読み込みます。(③、④の部分) 以上がmojaviを使った一連の流れです。 mojaviを使う WEBプログラマはまず何をするかというと、図で言うところの「①」の処理を考えます。 クライアントからのリクエストは「http //127.0.0.1/mojavi_tutorial/www/index.php?module=Default action=hello」というようなURLでリクエストされます。またその時、GETなどのデータが付随することになります。 このリクエストでは、mojaviに「default」モジュールに「hello」というアクションを発生させるリクエストです。 一応、「Default」というモジュールは最初から存在します。 しかし、helloというアクションをどのように処理するかはプログラマが決定しなければなりません。 では、helloというアクションを受け取ったら「Hello!」という文字をクライアントに返す様なプログラムを作ってみましょう。 「hello」というアクションの処理 「/webapp/modules/Default/actions」に「helloAction.class.php」というファイルを作ってください。(文字コードはEUC) そのファイルの内容を以下のように入力します。 ?php class helloAction extends Action { function execute ( $controller, $request, $user) { $request- setAttribute( message , Hello! ); return success ; } } ? クライアントから「hello」アクションを受け取るとexecute関数がmojaviから呼び出されます。helloアクションを受け取ったときにやりたいことをここに書き込めばいいのです。 今回はなにやら難しい事がexecute関数内に書いてありますが、そのまま入力してください。 「hello」アクションのに対するviewの処理 action処理が終了すると(上のexecute関数が実行された後)mojaviはviewを呼び出します。 「/mojavi_tutorial/modules/Default/views」に「helloView_success.class.php」というファイルを作ってください。 「hello」action処理が終わると「hello」view処理が始まるわけです。その内容を「helloView_success.class.php」に書き込みます。 ?php class helloView extends View { function execute ( $controller, $request, $user) { $renderer = new Renderer($controller, $request, $user); $renderer- setTemplate( defaultindex.tpl ); $renderer- setAttribute( view_message , $request- getAttribute( message )); return $renderer; } } ? Rendererというクラスは、Smartyなどと同じくテンプレートクラスです。つまりこの例でいうなら、「defaultindex.tpl」というファイルの一部を置き換える必要があれば置き換え、その結果をクライアントに返すというクラスです。 この場合、defaultindex.tplというファイル内に「view_message」という変数が合った場合、action処理でmessageにセットいした内容を置き換えるという意味になります。 では、defaultindex.tplというファイルの中身はどうなっているのかというと...... このチュートリアルではまだ作成していないので作成しなければなりませんね。 テンプレートの作成「defaultindex.tpl」 「/webapp/modules/Default/templates」に「defaultindex.tpl」というファイルを作成します。(もちろん、文字コードをEUCで) div ?= $template[ view_message ] ? /div のように書き込み保存してください。 実行 では、早速アクセスしてみることにしましょう。 http //127.0.0.1/mojavi_tutorial/www/index.php?module=Default action=hello (ドキュメントルートにある「www」の中にある「index.php」を実行します。その時、上記のURLのようにGETパラメータをつけます) ブラウザに「Hello!」と表示されましたか? 少し発展 表示するメッセージを変えてみます。 「helloAction.class.php」 $request- setAttribute( message , Hello! ); // ←ここを変える $request- setAttribute( message , Hello!World! );と変えてみた。 アクセスすると、ブラウザに「Hello!World!」となるはずです。 次回 コレを見ている殆どのWEBプログラマはなんでactionとviewの二つに分けるんだ?めんどくさくてしょうがないと思うかもしれません。 たしかに、フレームワークを無視してaction処理時に「print」などでブラウザに表示する文字を出力した方が直感的かもしれません。 が、フレームワークの趣旨がロジックとデザインの分業なわけで。 ロジック部はすべてaction処理に任せます。例えば、ファイルから文字列を読み取るなどの処理はaction処理で行います。 読み取ったデータなどは「setAttribute関数」を使ってviewに渡します。 view処理では「getAttribute関数」でファイルから読み取ったデータをどのように表示するかを決めます。 一人の人間が両方やると、なんだか馬鹿らしいですが複数の役割分担でプログラムする場合は、分業ができるので便利かもしれません。 次回はクライアントからデータを受け取ります。双方向処理を行います。
https://w.atwiki.jp/java_pro/pages/18.html
public class Sansho2 { public static void main(String[] args){ String a = "Hello"; a = a + "world"; String b = "Hello"; b = b + "world"; System.out.println("aの値は " + a); System.out.println("bの値は " + b); if (a == b){//String型のaとbを比較 System.out.println("同じです。"); } else { System.out.println("違います。"); } } }
https://w.atwiki.jp/java_pro/pages/17.html
public class Sansho1 { public static void main(String[] args){ String a = "Helloworld"; String b = a; System.out.println("aの値は " + a); System.out.println("bの値は " + b); if (a == b){//String型のaとbを比較 System.out.println("同じです。"); } else { System.out.println("違います。"); } } }
https://w.atwiki.jp/gohongilab2/pages/102.html
tags Java Microsoft case references ShapiroVarian1999information chapter 8 p452@ja オープンな標準は、市場を自分勝手な方向へ拡張してやがて設置ベースまでコントロールしようと狙っている企業に、”ハイジャック”されることもある。マイクロソフトはJavaとHTMLの両方を同社独自の方向へ拡張しているとして非難されてきた。
https://w.atwiki.jp/kodan/pages/69.html
[JavaScript] POST送信 [JavaScript] window.open()でPOST [JavaScript] 16進数6桁表示(RGB風) [JavaScript] Arrayへの追加 [JavaScript] Date [JavaScript] e.preventdefaultでスクロール制御 [JavaScript] img.srcとimg.onloadのタイミング [JavaScript] jqxhrの中身 [JavaScript] エスケープ [JavaScript] カラーパレット [JavaScript] ガントチャート [JavaScript] クラス化の方法 [JavaScript] チェックボックスに色付け [JavaScript] テキストボックスの入力可・不可切り替え [JavaScript] 引数の値渡し、参照渡し [JavaScript] 切り上げ [JavaScript] ロードのタイミング [JavaScript] elementへ子要素追加 [JavaScript] フォーカスが外れた際に発行されるイベント [JavaScript] jQueryでブラウザ判定 [JavaScript] サンプル [JavaScript] 単体テストサンプル
https://w.atwiki.jp/minosvs/pages/16.html
配列とコレクション JavaVMのメモリ構造 オーバーライドと隠蔽 ロギング処理(Log4j)
https://w.atwiki.jp/tikipoto/pages/19.html
JAVA仮想マシン Javaバイトコードをそのプラットフォームのネイティブコードに変換して実行するソフトウェア。Java言語で開発されたソフトウェアは、配布時にはプラットフォームから独立した独自の形式(Javaバイトコード)になっており、そのままでは実行することができない。このため、そのプラットフォーム固有の形式(ネイティブコード)に変換するソフトウェアを用意して、変換しながら実行する。この変換と実行を行なうのがJVMである。実行前にまとめて変換することで実行時のオーバーヘッドをなくし、実行速度を向上させたものをJITコンパイラという。 .NET SOA
https://w.atwiki.jp/sevenlives/pages/610.html
予約語(Java) 読み:よやくご 英語:reserved word 別名: 意味: 予約語とはその言語であらかじめ予約されており変数や関数名などの単語のこと。 Javaでは50のクラス名やメンバ、変数などプログラマが定義できる識別子には命名規則に沿っていても使えない単語となります。 Javaの予約語 abstract assert boolean break byte case catch char class const continue default do double else enum extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchrnized this throw throws transient try void volatile while プラス true, false, nullといった特別な意味をもつ物も変数などの名前には使えない。 2008年04月08日 Java キーワード
https://w.atwiki.jp/m1000/pages/24.html
Javaアプリ M1000のJavaの仕様 CLDC v1.0 and MIDP v2.0 compliant Maximum MIDlet suite size Available Space (24M) Heap size Available RAM (16M) Maximum record store size Available Space (24M) MIDlet storage available Available Space (24M) Interface connections HTTP, HTTPS,Socket, SeverSocket,SMS UDP Maximum number of sockets TBD Supported image formats .PNG, .JPEG Double buffering Supported Encoding schemes ISO8859_1, ISO10646 Input methods Touch Screen Additional API’s JSR 82, JSR 120, JSR 135,JSR 185 Audio MIDI, WAV, AMR, MP3 Video MPEG4 JSR 82 Java APIs for Bluetooth http //jcp.org/en/jsr/detail?id=82 (Java API for OBEXは未対応) JSR 120 Wireless Messaging API (WMA) 1.0 http //jcp.org/en/jsr/detail?id=120 SMSを含むメッセージ機能 JSR 135 Mobile Media API(MMAPI) 1.1 http //jcp.org/en/jsr/detail?id=135 マルチメディア機能 MIDletでもNative APIにアクセスできる手段はある模様 http //www.symbian.com/developer/techlib/papers/java_MIDP.asp ツール Motorola SDK for J2ME http //www.motocoder.com/motorola/template.jsp?filename=center_toolsSDK.jsp J2ME Wireless Toolkit 2.2 J2ME Wireless Toolkit ダウンロード 2.2 リリース J2SE J2SE Downloads EclipseME(Eclipse用MIDlet開発プラグイン Eclipse統合開発環境 参考書籍 MIDP 2.0 携帯Javaアプリ開発ハンドブック 参考HP ドコモ仕様とMIDPはどう違う? 携帯Java最新事情 MIDPプログラミング入門(前編) MIDPプログラミング入門(後編) J2ME™ specifications http //www.java.sun.com/j2me MIDP v2.0 specifications http //www.java.sun.com/products/midp CLDC v1.0 specifications http //www.java.sun.com/products/cldc Midlet.org MIDletアプリ配布サイト midlet.org - wireless java downloads HTTP通信でサーバからUTF-8で送信した日本語文字列が化けてしまうのはなぜだかわかりますか?確かM1000アプリではUTF-8はいけたはずなのですが。"SJIS"はサポートされていませんので、WTKでは日本語が表示できても、M1000では、化けたままでしたし。誰かお分かりになる方いらっしゃいませんか? -- 名無しさん (2005-08-26 18 01 24) 例えば文字コードのbyte配列を文字列にする場合new String(bytes[], "UTF-8");と意図的にエンコードを指定してやる必要があるかも。既にやっていたり的違いだったらすみません。 -- 名無しさん (2005-08-27 00 21 07) ゼロからJava開発環境を作るなら、“J2SE Development Kit 5.0 Update 6 with NetBeans 4.1 Bundle”と“NetBeans Mobility Pack 4.1”の組み合わせが楽だと思います。 -- 名無しさん (2005-12-25 21 16 08) lng3rewe hf0b1cq810ds 9lbt08zek78jb36hu -- phil9x8799 (2007-07-19 12 49 40) zpzhs40z29 ske20m8xui6p lolo2kkdaq6w9l8 -- x1b2sluit2 (2007-07-19 12 50 52) null espouse bipartisan?isolated balsam adjudges Egyptology subtler,caffein? -- 名無しさん (2008-08-25 08 30 57) null glad cholera.Angeles!squatting ray!debug tracts consensual,gory skunk.bridling [http //www.homeownersinsurok.com/a-m-best-ratings-on-homeowners-insurance.html post office home insurance ] http //www.homeownersinsurok.com/a-m-best-ratings-on-homeowners-insurance.html reformatted.Mali!symbolic?regular hollow [http //www.homeownersinsurok.com/aaa-home-insurance-quotes.html fla mobil home insurance aaa home insurance quotes] http //www.homeownersinsurok.com/aaa-home-insurance-quotes.html derogatory!enjoining?[http //www.homeownersinsurok.com/aaa-home-owners-insurance.html property and casualty insurance ] http //www.homeownersinsurok.com/aaa-home-owners-insurance.html icosahedra?expect confirmations [http //www.homeownersinsurok.com/aaa-homeowner-insurance-premium-increase.html mobile home insurance quotes ] http //www.homeownersinsurok.com/aaa-homeowner-insurance-premium-increase.html relent gigavolt lords peppy [http //www.homeownersinsurok.com/arizona-home-owners-insurance.html what does homeowners insurance cover ] http //www.homeownersinsurok.com/arizona-home-owners-insurance.html mounting Pablo Alastair circularity?incompleteness [http //www.homeownersinsurok.com/certified-property-insurance.html home insurance rates ] http //www.homeownersinsurok.com/certified-property-insurance.html socialism Archie [http //www.homeownersinsurok.com/cheap-landlord-insurance-in-america.html prudential home insurance ] http //www.homeownersinsurok.com/cheap-landlord-insurance-in-america.html single intestine Howard [http //www.homeownersinsurok.com/compare-home-insurance.html best home insurance ] http //www.homeownersinsurok.com/compare-home-insurance.html cobbler.repositioning [http //www.homeownersinsurok.com/cost-of-home-title-insurance-new-hampshire.html homeowner insurance quote ] http //www.homeownersinsurok.com/cost-of-home-title-insurance-new-hampshire.html garbled?pin regiments hottest less![http //www.homeownersinsurok.com/false-flood-insurance-fraud-statute-of-limitations.html asda home insurance ] http //www.homeownersinsurok.com/false-flood-insurance-fraud-statute-of-limitations.html drapers!memoir appeals,[http //www.homeownersinsurok.com/flood-insurance-cost.html home inspectors insurance ] http //www.homeownersinsurok.com/flood-insurance-cost.html nestles standstill Fritz [http //www.homeownersinsurok.com/flood-insurance-tips.html flood insurance tips rental home insurance ] http //www.homeownersinsurok.com/flood-insurance-tips.html addictions!variances [http //www.homeownersinsurok.com/florida-apartment-business-insurance.html renters insurance ] http //www.homeownersinsurok.com/florida-apartment-business-insurance.html nun tunnel correctives door card,[http //www.homeownersinsurok.com/florida-hurricane-insurance.html building insurance landlord ] http //www.homeownersinsurok.com/florida-hurricane-insurance.html expenses infinitives chairman Africans [http //www.homeownersinsurok.com/florida-property-insurance-rates.html cheap homeowners insurance ] http //www.homeownersinsurok.com/florida-property-insurance-rates.html dismally advertisement [http //www.homeownersinsurok.com/free-homeowners-insurance-quotes.html home insurance policy ] http //www.homeownersinsurok.com/free-homeowners-insurance-quotes.html Asiatic strategist inspections Saxonizes plainly [http //www.homeownersinsurok.com/free-quote-mobile-home-insurance.html citizens property insurance florida ] http //www.homeownersinsurok.com/free-quote-mobile-home-insurance.html Madsen pocketbook balkiness obsolescent psychology?[http //www.homeownersinsurok.com/gmac-home-owners-insurance.html flood insurance rate maps ] http //www.homeownersinsurok.com/gmac-home-owners-insurance.html aspect evenly proximal [http //www.homeownersinsurok.com/guest-house-insurance.html buy flood insurance ] http //www.homeownersinsurok.com/guest-house-insurance.html dialog slick portage Rousseau [http //www.homeownersinsurok.com/home-building-contractors-insurance.html oldier home insurance ] http //www.homeownersinsurok.com/home-building-contractors-insurance.html Cezannes.hopeful butyrate dealership.Wellman.[http //www.homeownersinsurok.com/home-insurance-companies-in-ohio.html home insurance new york ] http //www.homeownersinsurok.com/home-insurance-companies-in-ohio.html disadvantage declassify sinusoid traveled glittered [http //www.homeownersinsurok.com/home-insurance-coverage-and-black-mold-and-florida.html home insurance chicago ] http //www.homeownersinsurok.com/home-insurance-coverage-and-black-mold-and-florida.html neutralize instigating?[http //www.homeownersinsurok.com/home-insurance-in-illinois.html home insurance fl ] http //www.homeownersinsurok.com/home-insurance-in-illinois.html carters interpolates fleshly tabulate.[http //www.homeownersinsurok.com/home-insurance-online-quotes.html home beneficial life insurance ] http //www.homeownersinsurok.com/home-insurance-online-quotes.html spindling elitist?invective [http //www.homeownersinsurok.com/home-owners-insurance-answer-center.html gmac home insurance ] http //www.homeownersinsurok.com/home-owners-insurance-answer-center.html eyewitnesses,gravitate infrastructure aqua [http //www.homeownersinsurok.com/home-owners-insurance-discrimination-laws.html house insurance company in allentown ] http //www.homeownersinsurok.com/home-owners-insurance-discrimination-laws.html hemlock domains Rockland reboot trumps [http //www.homeownersinsurok.com/home-owners-rights-foreclosure-fha-mortgage-insurance.html florida mobile home hurricane insurance ] http //www.homeownersinsurok.com/home-owners-rights-foreclosure-fha-mortgage-insurance.html Jacoby!ignores.lilacs increasing mailings![http //www.homeownersinsurok.com/home-state-county-mutual-insurance.html hurricane insurance in florida ] http //www.homeownersinsurok.com/home-state-county-mutual-insurance.html prudent!vagabonds!heterogeneous [http //www.homeownersinsurok.com/homeowner-insurance-for-pitbull-owners.html flood insurance rate maps ] http //www.homeownersinsurok.com/homeowner-insurance-for-pitbull-owners.html paperwork Utrecht [http //www.homeownersinsurok.com/homeowner-insurance-policy-template-example.html homeowner insurance companies ] http //www.homeownersinsurok.com/homeowner-insurance-policy-template-example.html peppers Stanhope twirl infeasible [http //www.homeownersinsurok.com/homeowners-insurance-compare.html home owner insurance quotes ] http //www.homeownersinsurok.com/homeowners-insurance-compare.html Babul antiquate [http //www.homeownersinsurok.com/homeowners-insurance-for-south-florida.html aarp home owners insurance ] http //www.homeownersinsurok.com/homeowners-insurance-for-south-florida.html pilgrimage.Keyes [http //www.homeownersinsurok.com/homeowners-insurance-palm-beach-county.html best home insurance ] http //www.homeownersinsurok.com/homeowners-insurance-palm-beach-county.html clement Kelsey [http //www.homeownersinsurok.com/house-insurance-companies-statesboro-ga.html home insurance rate ] http //www.homeownersinsurok.com/house-insurance-companies-statesboro-ga.html gorges intellectuals taxiing?overrode Mickey [http //www.homeownersinsurok.com/house-insurance-comparison.html california home owner insurance ] http //www.homeownersinsurok.com/house-insurance-comparison.html codeword?index [http //www.homeownersinsurok.com/how-much-condo-insurance.html home state county insurance company ] http //www.homeownersinsurok.com/how-much-condo-insurance.html hosted Alsatian [http //www.homeownersinsurok.com/low-cost-home-insurance.html insurance home owners ] http //www.homeownersinsurok.com/low-cost-home-insurance.html cursor beginnings bilabial staging [http //www.homeownersinsurok.com/low-rate-florida-homeowners-insurance.html login ] http //www.homeownersinsurok.com/low-rate-florida-homeowners-insurance.html generalization appointing![http //www.homeownersinsurok.com/manhattan-life-insurance-building.html geico home insurance ] http //www.homeownersinsurok.com/manhattan-life-insurance-building.html etymology minicomputers hierarchy [http //www.homeownersinsurok.com/maryland-homeowner-insurance-policy-exclusions.html aig home insurance ] http //www.homeownersinsurok.com/maryland-homeowner-insurance-policy-exclusions.html newly varnish uninteresting initiate orbiter [http //www.homeownersinsurok.com/mass-property-insurance.html homeowners insurance companies ] http //www.homeownersinsurok.com/mass-property-insurance.html layoff Zanzibar Amiga [http //www.homeownersinsurok.com/metropolitan-direct-property-and-casualty-insurance-company.html safeco home insurance ] http //www.homeownersinsurok.com/metropolitan-direct-property-and-casualty-insurance-company.html reassures inker [http //www.homeownersinsurok.com/mobile-home-insurance-policies.html major home insurance companies ] http //www.homeownersinsurok.com/mobile-home-insurance-policies.html prodigal Armata dietary [http //www.homeownersinsurok.com/mobile-home-owners-insurance-florida.html low rate florida homeowners insurance ] http //www.homeownersinsurok.com/mobile-home-owners-insurance-florida.html Pomerania ornamentation,document,[http //www.homeownersinsurok.com/nrma-home-insurance.html homeowner insurance florida ] http //www.homeownersinsurok.com/nrma-home-insurance.html slings designer uselessness [http //www.homeownersinsurok.com/progressive-insurance-home-page.html prudential home insurance ] http //www.homeownersinsurok.com/progressive-insurance-home-page.html nimble chill!disbursements [http //www.homeownersinsurok.com/renters-insurance-ca.html visit now ] http //www.homeownersinsurok.com/renters-insurance-ca.html chamberlains Rheinholdt Speakerphones rookie![http //www.homeownersinsurok.com/renters-insurance-for-apartments-in-augusta-ga.html mandatory homeowners insurance ] http //www.homeownersinsurok.com/renters-insurance-for-apartments-in-augusta-ga.html gravestone stranglers [http //www.homeownersinsurok.com/vacant-home-insurance.html homeowner insurance quotes ] http //www.homeownersinsurok.com/vacant-home-insurance.html costing bereft modest.modulo![http //www.homeownersinsurok.com/vacant-property-insurance.html allstate home insurance ] http //www.homeownersinsurok.com/vacant-property-insurance.html - Tons of interesdting stuff!!! -- 名無しさん (2008-08-31 08 11 19) 名前 コメント
https://w.atwiki.jp/aias-jsstyleguide2/pages/13.html
JavaScriptの言語仕様に関するルール 各項目の左側にある三角ボタンで、詳細情報の表示・非表示を切り替えられます。また下のボタンを使うと全項目を一度に変更することができます。 全て切り替える var 常に、varと共に変数を宣言します。 varの指定がない場合、変数はグローバルコンテキストに置かれ、既存の値を上書きする可能性があります。またもし宣言そのものがなければ、その変数のスコープがどこにあるのか分かりにくくなります(その変数はローカルスコープと同じように、DocumentやWindowの中に存在していてもよいのです)。従って常にvarと共に変数を宣言してください。 定数 定数値にはNAMES_LIKE_THISのような名前をつけます。 変数やプロパティの参照先が固定されている(上書きできない)ことを示すには、@constを使います。 Internet Explorerがサポートしないconst キーワードは決して使いません。 定数値 ある値を一定で変化しないものとして扱いたい場合、名前をCONSTANT_VALUE_CASE.ALL_CAPSのように全て大文字にし、さらに@constによって上書きできないことを示してください。 プリミティブ型(number、string、boolean)はもともと定数値です。 オブジェクトの不変性の判断は、より主観的です - 観察可能な状態変化が起きていない場合のみ、オブジェクトは不変とみなされるべきです。ただしCompilerはこの考え方を強制しません。 (変数・プロパティへの)定数ポインタ 変数やプロパティに付けられた@constアノテーションは、それらを上書きできないことを表します。この規則はCompilerによるビルド時に強制されます。またこの動作はconst キーワードとも矛盾しません。(Internet Explorerがサポートしないため、constキーワードは使いませんが。) メソッドに付けられた@constアノテーションは、サブクラスがそのメソッドをオーバーライドできないことを表します。 コンストラクタに付けられた@constアノテーションは、そのクラスをサブクラス化できないことを表します。(Javaにおける@finalと同じです) 例 @constは、(CONSTANT_VALUES_CASE形式の名前のように)変数の値そのものが一定であることを必ずしも意味しません。一方CONSTANT_VALUES_CASE形式の名前は@constの示す内容を内包しています。 /** * ミリ秒単位のリクエストタイムアウト時間 * @type {number} */ goog.example.TIMEOUT_IN_MILLISECONDS = 60; 大文字だけの名前は@constの内容を含むため、この秒数は定数です。値の上書きはできません。 オープンソースのコンパイラは@constがついていないシンボルの上書きを許容すると思われます。 /** * 文字列を返すURLのマップ * @const */ MyClass.fetchedUrlCache_ = new goog.structs.Map(); /** * サブクラス化できないクラス * @const * @constructor */ sloth.MyFinalClass = function() {}; このケースではプロパティ値であるオブジェクトは上書きされませんが、オブジェクトの値は頻繁に変化し一定ではありません。(このため名前には大文字ではなくキャメルケースが使われています) セミコロン 常にセミコロンを使います。 暗黙的なセミコロンの挿入に依存することは、微妙な、デバッグしにくい問題を引き起こします。もっと良い方法を選びましょう。 次のコードのセミコロンの無い箇所は、その危険性を示す典型的な例です // 1. MyClass.prototype.myMethod = function() { return 42; } // ここにはセミコロンがありません。 (function() { // ローカルスコープを生成する関数の中に書かれた初期化処理。 })(); var x = { i 1, j 2 } // ここにはセミコロンがありません。 // 2. Internet ExplorerかFirefoxかによって処理を振り分けます。 // こんなコードは書かないとは思いますが、とりあえずお許しを。 [ffVersion, ieVersion][isIE](); var THINGS_TO_EAT = [apples, oysters, sprayOnCheese] // ここにはセミコロンがありません。 // 3. bash風の条件分岐。 -1 == resultOfOperation() || die(); 何が起きるか? JavaScriptエラー - 先ず、42を返す関数が2番目の関数を引数として実行されます。次に42が "コール" され、数字なのでエラーが発生します。 x[ffVersion, ieVersion][isIE]()を実行しようとしたランタイムから、おそらく undefined にはそのようなプロパティはありません という風なエラーが返されます。 配列マイナス1はNaNとなり、NaNはどんな値とも一致しないため必ずdie()が呼び出されます(たとえresultOfOperation()の戻り値がNaNだったとしても)。THINGS_TO_EATにはdie()の戻り値が代入されます。 なぜ? その存在が安全に推測される場合を除き、JavaScriptは文(statement)の末尾にセミコロンを要求します。上の各例では、関数宣言、オブジェクト、配列リテラルは1つの文の内側にいると見なされています。閉じ括弧は文の終了を表すには不十分です。JavaScriptは中置演算子(+、-など)や括弧では決して文を終了させません。 このことは本当に人々を驚かせます。従って文の末尾は確実にセミコロンで終わらせるべきです。 セミコロンと関数について 関数式の後ろにはセミコロンを付けますが、関数宣言の後ろには付けません。その違いを示す非常に分かりやすい例がこれです var foo = function() { return true; }; // ここにはセミコロンを付けます function foo() { return true; } // ここにはセミコロンを付けません ネストされた関数 使えます。 ネストされた関数は、例えば継続(continuation)の生成やヘルパー関数の隠蔽を行う際に、とても役立ちます。遠慮なく使いましょう。 ブロック内での関数宣言 使わないでください。 次のように書いてはいけません if (x) { function foo() {} } ほとんどのスクリプトエンジンはブロック内での関数宣言をサポートしていますが、それはECMAScript(ECMA-262,13及び14項を参照)の仕様には含まれていません。各エンジンの実装は、互いの間でも将来のECMAScriptに対しても、一貫性が保証されていません。ECMAScriptは関数の宣言をスクリプトのトップレベルか関数内のスコープでのみ許しています。代わりに変数へ関数を代入すれば、ブロック内でも関数を定義することが可能です if (x) { var foo = function() {}; } 例外 使えます。 もし自明でない何かを行うのであれば(アプリケーション開発フレームワークの利用など)、基本的に例外は避けられません。使いましょう。 独自の例外 使えます。 独自の例外を使わない場合、何かの値を返す関数が更にエラー情報も返そうとすると、その方法はトリッキーかつエレガントでないものになりそうです。戻り値をエラー情報への参照にするか、あるいはエラー情報をメンバに持つオブジェクトに変えることになるでしょう。これらは本質的に、原始的な例外ハンドリングのハックと言えます。必要であればどんどん独自の例外を使ってください。 標準機能 標準機能は非標準の機能よりも常に優先されます。 移植性と互換性を最大化するため、常に標準化された機能の方を選択してください。(例えばstring[3]ではなく string.charAt(3)を、DOM要素へのアクセスには特定のアプリケーションが提供する簡略化された機能ではなく、DOMの標準機能を使います) プリミティブ型のラッパーオブジェクト 使わないでください。 プリミティブ型のラッパーオブジェクトは使う理由がないだけでなく、危険ですらあります var x = new Boolean(false); if (x) { alert( hi ); // hi と表示されます。 } このようにしてはいけません! ただし、型のキャストに使うのは全く問題ありません var x = Boolean(0); if (x) { alert( hi ); // これは決してアラートされません。 } typeof Boolean(0) == boolean ; typeof new Boolean(0) == object ; これは何らかのデータを数値、文字列、論理値に変換するにはとても良い方法です。 多段階のプロトタイプ階層 好ましくありません。 多段階のプロトタイプ階層はJavaScriptが実装する継承手法です。ユーザ定義クラス D のプロトタイプを別のユーザ定義クラス B にすると多段階の階層構造が作れます。しかしこれらの階層構造を正しく把握しておくのは、最初の状態と比べるとかなり難しいことです。 このため、継承にはClosure Libraryのgoog.inherits()のようなライブラリ関数を使うのが最善です。 function D() { goog.base(this) } goog.inherits(D, B); D.prototype.method = function() { ... }; メソッドとプロパティの定義 /** @constructor */ function SomeConstructor() { this.someProperty = 1; } Foo.prototype.someMethod = function() { ... }; "new"によって生成されるオブジェクトにメソッドやプロパティを付け加えるにはいくつかの方法がありますが、メソッドではこのスタイルが推奨されます Foo.prototype.bar = function() { /* ... */ }; その他のプロパティでは、コンストラクタの中で初期化を行うスタイルが推奨されます /** @constructor */ function Foo() { this.bar = value; } なぜ? 現在のJavaScriptエンジンは、オブジェクトをその「形状」に基いて最適化します。プロパティの追加(プロトタイプに設定された値のオーバーライドも含まれます)はオブジェクトの形状を変化させ、パフォーマンスの低下をもたらします。 delete より好ましいのは this.foo = null の方です。 Foo.prototype.dispose = function() { delete this.property_; }; ではなく、こう書きましょう Foo.prototype.dispose = function() { this.property_ = null; }; 現代のJavaScriptエンジンにおいて、プロパティの数を増減させる処理は、値の再割り当てに比べはるかに低速です。次の場合を除き、deleteキーワードは避けるべきです。 プロパティ名をキーとする反復処理を行なっており、そのキーを削除する必要があるとき if (key in obj)の結果を変更する必要があるとき クロージャ 使えます、しかし慎重に。 クロージャを作成できる能力は、おそらく最も役に立つ、しかししばしば見落とされているJSの特長です。クロージャの動作についての良い解説はこちらをご覧ください。 しかし1つ覚えておいて欲しいのは、クロージャは自身を取り囲むスコープへのポインタを保持しているという点です。このためクロージャをDOM要素ヘ結びつけると、循環参照が発生しメモリリークとなることがあります。例えば次のコードです function foo(element, a, b) { element.onclick = function() { /* a と b を使う */ }; } クロージャ関数は element、a、bへの参照を持っています。elementを使わないとしてもです。elementもまたクロージャへの参照を保持しており、そこでガーベジコレクションが回収できない循環ができてしまっています。この状況では、コードは次のように構成されるべきです function foo(element, a, b) { element.onclick = bar(a, b); } function bar(a, b) { return function() { /* a と b を使う */ }; } eval() コードローダまたはREPL(Read-eval-print loop)にのみ使います。 eval()はセマンティクスに混乱を引き起こします。またユーザの入力を含む文字列をeval()することは危険な行為です。たいていはもっと適切、明確、安全なコードの書き方が存在するため、通常その利用は許容されません。 JSONを用いたRPCの際、データの解釈にはeval()の代わりにJSON.parse()を使います。 以下のような結果を返すサーバがあるとします { "name" "Alice", "id" 31502, "email" "looking_glass@example.com" } var userInfo = eval(feed); var email = userInfo[ email ]; 配信データが悪意あるJavaScriptコードを含むものに改変されていたとして、eval()を使っていたらコードはそのまま実行されてしまうでしょう。 var userInfo = JSON.parse(feed); var email = userInfo[ email ]; JSON.parse()を使うと、(全ての実行可能なJavaScriptを含む)不正なJSONに対して例外が発生します。 with() {} 使わないでください。 withの使用はプログラムのセマンティクスを曇らせます。withで指定されたオブジェクトはローカル変数と衝突するようなプロパティを持てるため、プログラムの意図が大きく変えられてしまうおそれがあります。例えばこのコードでは何が起きるでしょうか? with (foo) { var x = 3; return x; } 答えは「あらゆることが起きる」です。ローカル変数xはfooのプロパティに乗っ取られます。もしxがsetterだった場合、3の代入は他の多くのコードを実行させる原因となりえます。withを使ってはいけません。 this オブジェクトのコンストラクタとメソッド、クロージャの作成時にのみ使います。 thisのセマンティクスは扱いが難しく、場合によってその参照先はグローバルオブジェクト(ほとんどはこれです)、呼び出し元のスコープ(eval内)、DOMツリー内のノード(要素に追加されたHTMLイベントハンドラ内)、新しく生成されたオブジェクト(コンストラクタ内)、何か他のオブジェクト(call()またはapply()された関数内)と変化します。 thisは容易に間違いの原因になってしまうので、本当に必要な次の場面だけに使用を限定します。 コンストラクタの中 オブジェクトのメソッドの中(クロージャの作成時を含む) for-in ループ オブジェクト / マップ / ハッシュ内をキーによって走査する場合のみ使えます。 for-inループはしばしば 配列(Array)内の要素をループ処理するという、間違った使い方をされています。for-inループは 0からlength-1までをループするのではなく、オブジェクトとそのプロトタイプチェーンに存在するキーを走査するものです。従ってそのような使い方はエラーを起こしがちです。失敗例をいくつか示します function printArray(arr) { for (var key in arr) { print(arr[key]); } } printArray([0,1,2,3]); // これは動作します。 var a = new Array(10); printArray(a); // これは正しくありません。 a = document.getElementsByTagName( * ); printArray(a); // これは正しくありません。 a = [0,1,2,3]; a.buhu = wine ; printArray(a); // これも正しくありません。 a = new Array; a[3] = 3; printArray(a); // これも正しくありません。 配列のループには必ず通常のfor文を使ってください。 function printArray(arr) { var l = arr.length; for (var i = 0; i l; i++) { print(arr[i]); } } 連想配列 決してArrayをマップ / ハッシュ / 連想配列として使わないでください。 Arrayを連想配列として使うことは許されていません..もっと正確に言えば、数字インデックス以外で配列要素にアクセスすることは許されていません。もしマップやハッシュが必要なのであれば、Arrayの代わりにObjectを使いましょう。実際、連想配列に求められている機能はArrayではなくObjectに実装されており、ArrayはただObjectを拡張しているに過ぎません(その他のJSの全てのオブジェクト、つまり Date、RegExp、Stringなども同様です)。 複数行の文字列リテラル 使わないでください。 このような書き方は禁止です var myString = A rather long string of English text, an error message \ actually that just keeps going and going -- an error \ message to make the Energizer bunny blush (right through \ those Schwarzenegger shades)! Where was I? Oh yes, \ you\ ve got an error and all the extraneous whitespace is \ just gravy. Have a nice day. ; 各行の先頭にある空白はコンパイル時にも安全に取り除かれることはなく、バックスラッシュ(\)の後ろの空白は分かりにくいエラーをもたらします。またこの記法はほとんどのエンジンでサポートされているとはいえ、ECMAScriptの標準ではありません。 代わりに、文字列の結合を使ってください var myString = A rather long string of English text, an error message + actually that just keeps going and going -- an error + message to make the Energizer bunny blush (right through + those Schwarzenegger shades)! Where was I? Oh yes, + you\ ve got an error and all the extraneous whitespace is + just gravy. Have a nice day. ; 配列リテラルとオブジェクトリテラル 使えます。 ArrayとObjectのコンストラクタではなく、配列リテラルとオブジェクトリテラルを使って下さい。 Arrayコンストラクタの引数はエラーの原因になりがちです // 配列の長さは3。 var a1 = new Array(x1, x2, x3); // 配列の長さは2。 var a2 = new Array(x1, x2); // もし x1 が自然数であれば、配列の長さは x1 になります。 // もし x1 が数値でかつ自然数でなければ、例外が発生します。 // それ以外なら、配列は x1 を値とする長さ1の配列になります。 var a3 = new Array(x1); // 配列の長さは0。 var a4 = new Array(); このため、誰かが引数の数を2つから1つに変更すると、その配列の長さは想定と合わなくなる可能性があります。 これらの奇妙な事例は、より可読性の高い配列リテラルを使用することで避けられます var a = [x1, x2, x3]; var a2 = [x1, x2]; var a3 = [x1]; var a4 = []; Objectコストラクタには同じ問題はありませんが、可読性と一貫性の面からオブジェクトリテラルを使うべきです var o = new Object(); var o2 = new Object(); o2.a = 0; o2.b = 1; o2.c = 2; o2[ strange key ] = 3; 上は、こう書かれるべきです var o = {}; var o2 = { a 0, b 1, c 2, strange key 3 }; 組込みオブジェクトのプロトタイプの書き換え しないでください。 Object.prototypeやArray.prototypeのような組込みオブジェクトのプロトタイプを書き換えることは、固く禁じます。同じ組込みであってもFunction.prototypeなどはそれほど危険ではありませんが、それでもデバッグの難しい問題を引き起こす可能性があります。よって書き換えは避けるべきです。 Internet Explorerの条件付きコメント 使わないでください。 これは禁止です var f = function () { /*@cc_on if (@_jscript) { return 2* @*/ 3; /*@ } @*/ }; 条件付きコメントはライタイムのJavaScriptシンタックス・ツリーを改変してしまうので、ツールによる自動化の妨げになります。