2013-05-02 4 views
2

У меня есть ошибка при использовании Rhino (17R4).используя Rhino, у меня есть исключение «ReferenceError»

My Goal is indent javascript source using jsbeautifier.js.

вот мой код:

import java.io.InputStream; 

import org.mozilla.javascript.Context; 
import org.mozilla.javascript.Scriptable; 

public class JSBeautifier { 
public String beautify(String jsSource) { 
    Context context = Context.enter(); 
    Scriptable globalScope = context.initStandardObjects(); 
    String beautify = getFileContents(JSBeautifier.class.getResourceAsStream("beautify.js")); 
    context.evaluateString(globalScope, beautify, "beautify", 1, null); 
    globalScope.put("source", globalScope, jsSource); 

    context.evaluateString(globalScope, "result = js_beautify(source);", "beautify", 1, null); 
    Object result = globalScope.get("result", globalScope); 

    return (String)result; 
} 

private String getFileContents(InputStream stream) { 
    StringBuffer contents = new StringBuffer(""); 
    try { 
     byte[] readBytes = new byte[1024]; 
     int i = 0; 
     while ((i = stream.read(readBytes)) > 0) 
      contents.append(new String(readBytes, 0, i)); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return contents.toString(); 
} 
} 

, когда я выполняю этот код, это произошло ниже исключения.

org.mozilla.javascript.EcmaError: ReferenceError: "js_beautify" is not defined. (beautify#1) 
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3687) 
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3665) 
at org.mozilla.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3750) 
at org.mozilla.javascript.ScriptRuntime.getNameFunctionAndThis(ScriptRuntime.java:2176) 
at org.mozilla.javascript.optimizer.OptRuntime.callName(OptRuntime.java:61) 
at org.mozilla.javascript.gen.beautify_2._c_script_0(beautify:1) 
at org.mozilla.javascript.gen.beautify_2.call(beautify) 
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394) 
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091) 
at org.mozilla.javascript.gen.beautify_2.call(beautify) 
at org.mozilla.javascript.gen.beautify_2.exec(beautify) 
at org.mozilla.javascript.Context.evaluateString(Context.java:1079) 
at test.util.jsconverter.JSBeautifier.beautify(JSBeautifier.java:20) 

Как исправить эту проблему?

ответ

4

Проблема заключается в том, что beautify.js является назначение его функции переменной в глобальной области

if (typeof define === "function") { 
    // Add support for require.js 
    define(function(require, exports, module) { 
     exports.js_beautify = js_beautify; 
    }); 
} else if (typeof exports !== "undefined") { 
    // Add support for CommonJS. Just put this file somewhere on your require.paths 
    // and you will be able to `var js_beautify = require("beautify").js_beautify`. 
    exports.js_beautify = js_beautify; 
} else if (typeof window !== "undefined") { 
    // If we're running a web page and don't have either of the above, add our one global 
    window.js_beautify = js_beautify; 
} else if (typeof global !== "undefined") { 
    // If we don't even have window, try global. 
    global.js_beautify = js_beautify; 
} 

Итак, вы должны создать аа глобальную переменную, которая может назначить свою функцию

context.evaluateString(globalScope, "var global = {};", "global", 1, null); 
context.evaluateString(globalScope, beautify, "beautify", 1, null); 
globalScope.put("source", globalScope, jsSource); 
context.evaluateString(globalScope, "result = global.js_beautify(source);", "beautify", 1, null); 
+0

ах! Мне этого не хватает!! Спасибо, @shyam –

1
result = js_beautifier(source); 

Это js_beautify.

+0

жаль для моего опечатки. верный. это js_beautify. но его результат такой же. –

+0

@igc_Cog Вы можете отладить его и убедиться, что 'beautify' не пуст? 'getFileContents()' возвращает пустую строку, если что-то пойдет не так. – zeroflagL

+0

уверен. это не пусто. во всяком случае, я получил решение. Благодарю. :-) –