2010年9月10日金曜日

最初に実行

最初に実行されるコード
AppleのSafari 5.0.1とMac OS X版 Firefox 3.6.8でしか試していないのですが、JavaScriptで最初に実行されるコードを四つの方法で試してみました。

試したコードは以下のような物です。
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  2.         "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html lang="en">  
  4. <head>  
  5.  <meta http-equiv="content-type" content="text/html; charset=utf-8">  
  6.  <title>Untitled</title>  
  7. <script type="text/javascript" language="javascript">  
  8. <!--  
  9. // 1st  
  10. alert('without any function');  
  11.   
  12. // 2nd  
  13. function init() {  
  14.  alert('called from body');  
  15. }  
  16.   
  17. // 3rd  
  18. window.onload = function() {  
  19.  alert('called from window.onload');  
  20. }  
  21.   
  22. // 4th  
  23. function loaded() {  
  24.  alert('called from addEventListener');  
  25. }  
  26.   
  27. addEventListener('load', loaded, false);  
  28.   
  29. //-->  
  30. </script>  
  31. </head>  
  32. <body onload='init()'>  
  33. </body>  
  34. </html>  
上記のコードをSafari 5.0.1で実行すると1st、4th、2ndの順で実行され、3rdは実行されません。

また、上記のコードのbodyタグの引数onloadをなくすと、1st、3rd、4thの順で実行され、2ndは実行されません。

Mac OS X版のFirefox 3.6.8で実行すると、1st、2nd、4thの順で実行され、3rdは実行されません。

Safariと同様にbodyタグの引数onloadをなくすと、1st、3rd、4thの順で実行され、2ndは実行されません。

3rdと4thは一般的に良く使用されるコードですが、1stと4thはAppleのエンジニアが書いたサンプルコードで見つけました。1stの方法はSafariに付属しているSQLiteのデータベースをJavaScriptから開く時に利用し、データベースのテーブルを開く時に4thの方法を利用していました。データベースを一番最初に開くという意味では1stの方法は便利かもしれませんが、メモリのフットプリント(占有領域)を小さくすると言う意味では以下の内容を考慮した方が良いと言えるでしょう。

もったいない
Appleの資料"Apple JavaScript Coding Guidelines"に、onload関連してメモリのフットプリント節約方法が書かれていました。

http://developer.apple.com/safari/library/documentation/ScriptingAutomation/Conceptual/JSCodingGuide/Introduction/Introduction.html

初期化コードなど一度しか実行しないコードは実行後にdeleteしてフットプリントを小さくすることを推薦しています。この資料では起動時の初期化コードを例として以下のようなコードを紹介しています。
var foo = function()
  1. {   
  2.  // code that makes this function work   
  3.  delete foo;   
  4. }   
  5. window.addEventListener('load', foo, false);  
おそらくはiPhoneなどメモリを多く積んでいない装置を想定した話しでしょうが、不用意にメモリを浪費するのは問題を引き起こしやすいですし、「もったいない」です(笑)

0 件のコメント: