Web JavaScriptは WebクライアントサイドのDOM標準APIにおいて、JavaScript実行環境OgO上で 使えるオブジェクト、クラスと関数を説明します。
windowオブジェクトは global と同じオブジェクトです。したがって、windowオブジェクトのプロパティと関数は「.」で指定しないで呼び出せます。 例えば function fun() { alert("ok"); } setTimeout(fun, 1000); // 1秒後に fun関数を実行する。
| clearInterval関数 | setInterval関数で設定された繰り返し動作をキャンセルします。 |
| clearTimeout関数 | setTimeout関数で設定された遅延を解除します。 |
| setImmediate関数 | イベントループ中に遅延して、関数を実行します。 |
| setInterval関数 | 一定の遅延間隔を置いて関数を繰り返し呼び出します。 |
| setTimeout関数 | 指定された遅延の後に、関数を実行します。 |
繰り返し呼出タイマーを識別する番号(識別子)を返します。
この繰り返しを中止するには、この識別子を引数にしてclearInterval関数を呼び出します。
// 1秒毎に関数を5回呼び出す。
var cnt = 0;
var timerID;
function func() {
cnt++;
print(cnt + "回");
if (cnt==5) clearInterval(timerID);
}
timerID = setInterval(func, 1000);
// 別バ-ジョン
var timerID;
function makefunc() {
var cnt = 0;
return function() {
cnt++;
print(cnt + "回");
if (cnt==5) clearInterval(timerID);
};
}
timerID = setInterval(makefunc(), 1000);
指定時間後に呼出すタイマーを識別する番号(識別子)を返します。
遅延呼出を中止するには、この識別子を引数にしてclearTimeout関数を呼び出します。
// 1秒毎に関数を5回呼び出す。
var cnt = 0;
var timerID;
function func() {
cnt++;
print(cnt + "回");
if (cnt!=5) timerID = setTimeout(func, 1000);
}
timerID = setTimeout(func, 1000);
標準出力と標準エラーに出力するためのものです。 ほとんどのブラウザで提供されているコンソールオブジェクトと同様ですが、 出力は標準出力か標準エラー出力に送られます。
ただし、OgO実行環境では デフォルト設定なら標準出力と標準エラーは OgOエディターに出力されます。
| log関数 | 標準出力へプリントします。 |
| error関数 | 標準エラー出力にプリントします。 |
var count = 1;
//・・・
console.log('count: %d', count);
var count = 1;
//・・・
console.error('error! at count: %d', count);
以下は sample.jsプログラムとjob1.js, job2.jsプログラムが並列に実行されます。
・sample.js parent Worker メインプログラム
var worker1 = new Worker("job1.js");
worker1.onmessage = function (event) {
var msg = event.data;
print("1から" + msg.N + "までの素数の数は、" +
msg.ans + "個です");
};
var worker2 = new Worker("job2.js");
worker2.onmessage = function (event) {
var msg = event.data;
print( "円周率 πの近似値 ≒ " + msg.ans +
" (試行回数=" + msg.N + ")" );
};
worker1.postMessage(1000000);
worker2.postMessage(1000000);
・job1.js child Worker 素数を数える
function primep( plist, i )
{
var j;
for (var iter=0, N=plist.length; iter<N; iter++) {
j = plist[iter];
if (j*j > i) return true;
if (i%j==0) return false;
}
}
function onmessage( event )
{
var n = event.data;
var plist = [];
plist.push(2);
plist.push(3);
for (var j=5, r=3; j<=n; j+=2, r++) {
if (primep(plist,j)) plist.push(j);
}
postMessage( {N:n, ans:plist.length} );
}
・job2.js child Worker モンテカルロ法でπを計算
function onmessage( event )
{
var n = event.data;
var hit = 0;
for (var i=0; i<n; i++) {
var x = Math.random(), y = Math.random();
if ( x*x + y*y < 1 )
hit++;
}
postMessage( {N : n, ans : 4*hit/n} );
}
・sample.js 実行結果
円周率 πの近似値 ≒ 3.143336 (試行回数=1000000)
1から1000000までの素数の数は、78498個です
・parent Worker メインプログラム
var worker = new Worker("job.js");
worker.onmessage = function (event) {
print("1から" + N + "までの素数の数は、" +
ans + "個です"); // ==> ReferenceError: N is not defined
};
worker.postMessage(1000000);
・job.js child Worker 素数を数える
var N, ans; // 「この2つの変数を parent Workerと共有する」考えで以下をスクリプトしている。
function primep( plist, i )
{
var j;
for (var iter=0, n=plist.length; iter<n; iter++) {
j = plist[iter];
if (j*j > i) return true;
if (i%j==0) return false;
}
}
function onmessage( event )
{
var n = event.data;
var plist = [];
plist.push(2);
plist.push(3);
for (var j=5, r=3; j<=n; j+=2, r++) {
if (primep(plist,j)) plist.push(j);
}
N = n;
ans = plist.length;
PostMessage(ans);
}
| Workerコンストラクター | Workerオブジェクトを作成 |
| onerror関数 | Workerタスクで起きたエラーを受け取る関数 |
| onmessage関数 | postMessage関数で送られたイベントメッセージを受け取る関数 |
| postMessage関数 | イベントメッセージを送る関数 |
| terminate関数 | Workerオブジェクトを終了させる関数 |
var worker = new Worker(function(){
var onmessage = function ( event ) {
var n = event.data;
var S = 0;
for (var i=1; i<=n; i++) {
S += i;
}
postMessage(S);
}
});
worker.onmessage = function (event) {
var S = event.data;
print("合計は " + S + "です。");
};
worker.postMessage(10);
worker.postMessage(100);
/* 実行結果
合計は 55です。
合計は 5050です。
*/
var worker = new Worker(function(){
var onmessage = function ( event ) {
throw new Error("error N="+event.data);
}
});
worker.onmessage = function (event) {
var S = event.data;
print("合計は " + S + "です。");
};
worker.onerror = function (event) {
print(event.message);
};
worker.postMessage(10);
worker.postMessage(100);
/* 実行結果
error N=10
error N=100
*/
var worker = new Worker(function(){
var onmessage = function ( event ) {
var n = event.data;
var S = 0;
for (var i=1; i<=n; i++) {
S += i;
}
postMessage( { N:n, S : S } );
}
});
worker.onmessage = function (event) {
var response = event.data;
print("1~" + response.N + "の合計は " + response.S + "です。");
};
worker.postMessage(10);
worker.postMessage(100);
/* 実行結果
1~10の合計は 55です。
1~100の合計は 5050です。
*/
var worker = new Worker(function(){
function primep( plist, i )
{
var j;
for (var iter=0, N=plist.length; iter<N; iter++) {
j = plist[iter];
if (j*j > i) return true;
if (i%j==0) return false;
}
}
function onmessage( event )
{
var n = event.data;
var plist = [];
plist.push(2);
plist.push(3);
for (var j=5, r=3; j<=n; j+=2, r++) {
if (primep(plist,j)) plist.push(j);
}
postMessage( {N:n, ans:plist.length} );
}
});
var count = 0;
worker.onmessage = function (event) {
var msg = event.data;
print("1から" + msg.N + "までの素数の数は、" +
msg.ans + "個です");
count++;
if (count==5) {
worker.terminate();
}
};
for (var i=0; i<100; i++) {
worker.postMessage(1000000);
}
/* 実行結果
1から1000000までの素数の数は、78498個です
1から1000000までの素数の数は、78498個です
1から1000000までの素数の数は、78498個です
1から1000000までの素数の数は、78498個です
1から1000000までの素数の数は、78498個です
*/