IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

JavaScript 1.7 の yield が凄すぎる件について

Firefox 2.0 beta 1 が出ましたね^^
さっそく、新機能のひとつ、JavaScript 1.7 の yield を使ってみました。

まず yield の動作を試してみた。

var i = 1;
var g = (function() {while(1) {yield i; i++}})();
alert(i); // 1
g.next(i);
g.next(i);
alert(i); // 2

これで分かったこと。

なんと、

yield は関数を途中で終了させている。。。!

実は。

いままで、何度も関数を途中で終了できればなーと思っていた。
JavaScript 以外のほとんどの言語でそれが可能で、それが便利だからである。
それとはなにか、それとはスレッドである。
スレッドは CPU レベルで細かーく処理を止めて、いろんな処理の流れを同時に実行させているようなものだ。

yield を使ったら JavaScript でスレッドのようなものを作れるのでは?

という仮説。

実際に作ってみた。

Firefox 2.0 beta 1 など(JavaScript 1.7 以上が動く環境)で見てください。
http://sample.ecmascript.jp/js17.html

うごいた!

四角い箱がぐるぐる回っているのが見えただろうか。
スレッド部分のソースはこんな感じ

function() {
  var $thread;
  while(true) {
    while(this.topCache < 200) {
      yield $thread;
      this.topCache += 2;
      this.style.top = this.topCache + 'px';
      this.style.opacity = this.opacityCache += 0.01;
    }
    while(this.leftCache < 200) {
      yield $thread;
      this.leftCache += 2;
      this.style.left = this.leftCache + 'px';
      this.style.opacity = this.opacityCache -= 0.01;
    }
    while(this.topCache > 100) {
      yield $thread;
      this.topCache -= 2;
      this.style.top = this.topCache + 'px';
      this.style.opacity = this.opacityCache += 0.01;
    }
    while(this.leftCache > 100) {
      yield $thread;
      this.leftCache -= 2; 
      this.style.left = this.leftCache + 'px'
      this.style.opacity = this.opacityCache -= 0.01;
    }
  }
}

あとは setInterval で回すだけ。

setInterval(function() {g.next()}, 10);

これを今までの JavaScript でやったら、どれだけめんどくさいだろうか。

このソースではまだまだ凄さが伝わらないかもしれないけど、

Java などで書かれたスレッド前提のプログラムを JavaScript に移植できるかもしれない。(Orto を使わなくてもw)
それだけじゃない。きっともっともっといろんなことができる!
うはー。夢がひろがりんぐ  (+∀+) いーるどありがとー

何でもできる!We can fly!

え? IE ってなんだけ?