Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

Rhinoでscope共有

なんかJSANでごにょったりしてたりするのでできねえのかなあとか思ってたんだけど。
AAA.jsとBBBB.jsを合わせて実行したいよおって場合コレでよくない?
例によって実験しながらのソースなんでめちゃ汚いんだけど。

RhinoRunner

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Script;
import org.mozilla.javascript.ScriptableObject;

public class RhinoRunner {

	public static void main(String[] args) {
		Context cx = null;
		try {
			RhinoRunner runner = new RhinoRunner();
			String filename1 = "C:\\foo.js";
			String filename2 = "C:\\bar.js";
			cx = Context.enter();
			ScriptableObject sharedScope = cx.initStandardObjects(null, true);
			runner.run(cx, sharedScope, filename1);
			runner.run(cx, sharedScope, filename2);

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (cx != null) {
				Context.exit();
			}
		}
	}

	public void run(Context cx, ScriptableObject sharedScope, String filename)
			throws IOException {
		// String filename = "C:\\foo.js";
		FileReader filin = new FileReader(filename);
		BufferedReader bufin = new BufferedReader(filin);

		try {
			runScript(cx, sharedScope, bufin, filename);
		} finally {
			bufin.close();
			filin.close();
		}
	}

	public void runScript(Context cx, ScriptableObject sharedScope, Reader in,
			String filename) throws IOException {
		Script script = cx.compileReader(in, filename, 1, null);
		Object result = script.exec(cx, sharedScope);

		if (result != Context.getUndefinedValue())
			System.err.println(Context.toString(result));
	}
}

foo.js

function test(x, y){
    return x+y;
}

var x = 1;
var y = 2;
var z = test(x,y);

bar.js

var x = 10;
var y = 20;
var z = test(x,y);
java.lang.System.out.println(z);

barにはtestファンクションが存在しないことに注目。

実行結果

30.0

呼べてるやん。普通に。
他のjavascriptライブラリを使う時ってこんな感じでいいんじゃないの???
なんか落とし穴あんのかな?

うくく。