kounoike さん、こんばんは


<kounoike@mbh.nifty.com> wrote in message news:bsbsi8$b7i$1@news511.nifty.com...

> ともかく,ECMA-262の規格ってよう分からんというのが正直な感想です。(もっと分
> かりやすくそれぞれの説明に例でも付けてくれればいいのに。この規格の解説書みた
> いなのは無いのかな。)インタープリター言語の中でも,もやもやとしたはっきりし
> ない仕様(私にとって)に思えて仕方ない。言語構造を理解した上で使うには相当難
> しいと感じます。読めば読むほど,分からなくなる私にとっては厄介な言語です。

kounoike さんの書かれる関数「increin()」「increout()」ともに、「return i」で変数
i を返す形で書いておきながら、実行の段階では、「i = (関数)」とせずに、単に関数
を実行している点で、仕様外の書き方かな、と感じてしまうところはあります。変数がグ
ローバルであることを期待して、関数の実行により変数を変化させておいてそれを外から
参照しようとしているなら、return 文が意味を為さないと思うのです。

もともと「もやもやとしたはっきりしない仕様」なのは、そういう仕様なのだからしよう
がないのでしょうが、僕はその辺のようわからんところは諦めてしまって、始めから変数
がローカルであるものとして書いておけばブラウザが変わったりしてもまあ大丈夫かなと
いうのが僕の思うところです。(変数がグローバルだと動作が変わってしまうような場面
があったとして、その時は別の文字で書いておけば大丈夫でしょうし。)

kounoike さんはきっとお判りの上で、動かないソース例を挙げられたのでしょうが、念
のため、動く(はずの)ソースも書いておきます。ローカル変数であることを強調して、
k, j を使っていますが、i で書いても動くはずです。


   var x = new Array('0','1','2','3','4','5','6','7','8','9');

   fortest();

   function fortest() {
      function increin(k) {
         do
         k++;
         while (!(k < 5 || k >= 7))
         return k;
      }

      document.write('------increin()-------' + '<BR>');
      for(var i = 2; i < x.length; i=increin(i)) {
         document.write(x[i] + '<BR>');
      }

      document.write('------increout()-------' + '<BR>');
      for(var i = 2; i < x.length; i=increout(i)) {
         document.write(x[i] + '<BR>');
      }
   }

   function increout(j) {
      do
      j++;
      while (!(j < 5 || j >= 7))
      return j;
   }