Unclear part in ENGINE_SCOPE and engine.eval()

Anuradha Karunarathna anuradha199528 at gmail.com
Tue Nov 13 10:31:18 UTC 2018


Hi,

I'm using nashon by embedding it in Java(not viacommand line). I found that

*The default context's ENGINE_SCOPE is a wrapped instance of
ECMAScript "global" object - which is the "this" in top level script
expressions. *

So I wonder where other variables are stored in the engine. I tested a
sample to load JS functions in a one file to another and the codes
could be found below.
Only *Require,require,function1,function2* and *libModule* were found
in the engine scope.
I want to know where other evalated code variables(eg:
*testModule,function3 and math in lib.js and increment in test.js*)
are stored?
I am happy to clearup this thing..

-------------------------------------java
code-----------------------------------------------
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        Invocable invocable = (Invocable) engine;
        engine.eval("load('require.js');");
        engine.eval("var require = Require()");
        engine.eval(new FileReader("script.js"));

        Object result = invocable.invokeFunction("function2", 50);

        Bindings engineBindings =
engine.getBindings(ScriptContext.ENGINE_SCOPE);
        engineBindings.forEach((k,v)->System.out.println("key : " + k
+ " value : " + v));

-------------------------------------------require.js-------------------------------------------
var Require=(function () {
    var File = java.io.File,
        FileReader = java.io.FileReader,
        BufferedReader = java.io.BufferedReader;


    var _require = function( path ) {
        var file,
            moduleInfo,
            buffered,
            head = '(function(exports,module,require,__filename,__dirname){ ',
            code = '',
            tail = '})',
            line = null;

        file = new File(path);


        buffered = new BufferedReader(new FileReader(file));
        while ( ( line = buffered.readLine()) !== null ) {
            code += line + '\n';
        }
        buffered.close();

        moduleInfo = {
            exports: {},
            require: _requireWrapper()
        };

        code = head + code + tail;


        var compiledWrapper = null;
        try {
            compiledWrapper = eval(code);
        } catch (e) {
            throw new Error( "Error evaluating module " + path
                + " line #" + e.lineNumber
                + " : " + e.message, e.lineNumber );
        }

        var args = [
            moduleInfo.exports, /* exports */
            moduleInfo,         /* module */
            moduleInfo.require, /* require */
        ];

        try {
            compiledWrapper
                .apply(null, args);
        } catch (e) {
            throw new Error( "Error executing module " + path
                + " line #" + e.lineNumber
                + " : " + e.message, e.lineNumber );
        }
        return moduleInfo;
    };

    var _requireWrapper = function() {
        return function( path ) {
            var module = _require(path );
            return module.exports;
        };
    };
    return _requireWrapper();
})

-----------------------------------------script.js----------------------------------------------------
var libModule = require('lib.js');


var function1 =function(name){
    print('Hi I am in script.js'+ name);
    return "greetings from javascript";
};

var function2 = function(number) {
    libModule.function3(number);
    return libModule.math(number);
};

-----------------------------------------------lib.js---------------------------------------------------
var testModule=require('test.js');

var function3= function(number) {
    print('Hi ' + number);

};

function math(number){
     number = testModule.increment(number);
     return number;
    };


module.exports.math =math;
module.exports.function3=function3;

----------------------------------------------test.js---------------------------------------------------------------
function increment(number){
     number+=5;
     return number;
    }

;
module.exports.increment=increment;
---------------------------------------------------------------------------------------------------------------------

Thanks in advance.

Anuradha


More information about the nashorn-dev mailing list