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個です */