このページは 2008年 01月 06日 12時08分52秒に更新されました。 |
JavaScript 初心者向けに開催している Web/JS 講習会で課題を出し、JavaScript 皆に同じ課題でコードを書いて貰いました。 イベントハンドラとは、何かイベントが発生した(クリックした、ページのロードが終わった、マウスをポイントした)タイミングで実行される関数のエントリポイントです。 window.onload の初期値は undefined で、ここに関数を割り当ててやると window オブジェクト(ブラウザ)が onload (読み込みを終えた)タイミングでその関数が実行されます。 と思うのは当然!なのですが先に説明したように関数実行のタイミングはお任せになっているのでコード上で function call 演算子を用いて引数を渡す方法が使えません。 関数内で変数を取り回すときにスコープは意識していると思います。何かのオブジェクトが今宣言した変数を管理している訳です。この「何か」を環境と呼びましょう。 上記例では、この環境に変数 word を追加して、それとひとくくりになった関数を返し window.onload にセットしています。 JavaScript では関数と環境は常にセットになっており、環境を指定して実行したり、あらかじめバインディングしておく事が出来ます。 今聞くとややこしく聞こえるかも知れませんが、JavaScript の仕様を理解しているとこれはシンプルです。 addOnLoad は既に onload にセットされている関数があれば新しく関数を作成し、その関数のプロパティに window.onload に登録されている関数の参照を作成し、新しい関数の中でそれを呼び出します。 addOnLoad が実行される度に新しく環境が作成されていくのがポイントです。スタックが4重であれば、4つの環境が存在し、それぞれで関数への参照が数珠つなぎのようにチェーンされている訳です。 これでどうなるかというと、既に onload にセットされている関数があれば新しく関数を作成し、グローバルオブジェクトのプロパティAに window.onload に登録されている関数の参照を作成し、新しい関数の中でそれを呼び出しています。 こうすると新しく作成された関数の中には常にAの呼び出しが含まれるため、2回目の addOnLoad で作成された関数オブジェクトに含まれる呼び出しと3回目のものとが相互に呼び合って無限ループに陥ります。 ディノオープンラボラトリは、株式会社ディノの社員ブログとして主に技術者向けに情報公開をするウェブサイトです。 多くの社員が自分の興味のあることについての記事を書き、結果として社外の方々にも面白がってもらえる状態が理想だと考えています。
[ 2] 同じコードを書いてもらって解説 Re: Web/JS part.4
[引用サイト] http://openlab.dino.co.jp/2007/09/21/18163970.html
|
戻る
一人暮らしの情報満載
一人暮しの情報満載
暮らしと生活、田舎暮し、一人暮し、美容暮し、家計暮し、節約暮し、洗濯暮し、
家計簿暮し、田舎暮らしの物件、住まい生活、暮らしと生活 |
情報の宝船【インフォマガジン】
暮らしと生活に役立つ無料情報が満載です。(いつでも解除できます)
今なら 『簡単すぎる!暮らしと生活をもっともっと幸せにする潜在意識活用法』のレポートをプレゼント!
3秒後に手に入れることができます。
>>詳細はコチラ |
|