Reputation: 800
I am writing some server-side scripts using JScript and WSH. The scripts are getting quite long, and some common functions and variables would fit better in a general library script which I included in my various script instances.
But, I cannot find a way reference one JScript file from another. For a moment, I though reading the file contents and passing it to eval()
could work. But, as it says on MSDN:
Note that new variables or types defined in the eval statement are not visible to the enclosing program.
Is there any way to include/reference a JScript file from another one?
Upvotes: 14
Views: 8848
Reputation: 1694
Based on Thomas's solution — here's a similar, but more modular approach. First, the script to call:
/* include.js */
(function () {
var L = {/* library interface */};
L.hello = function () {return "greetings!";};
return L;
}).call();
Then, in the calling script:
var Fs = new ActiveXObject("Scripting.FileSystemObject");
var Lib = eval(Fs.OpenTextFile("include.js", 1).ReadAll());
WScript.echo(Lib.hello()); /* greetings! */
Libraries defined this way don't produce or rely on any upvalues, but the eval
will return any value it receives from the surrounding anonymous-function in the library.
Upvotes: 11
Reputation: 156434
Try using a Windows Script File. It's basically an XML document which allows you to include multiple script files and define multiple jobs, amongst other things.
<!-- MyJob.wsf -->
<job id="IncludeExample">
<script language="JScript" src="MyLib1.js"/>
<script language="JScript" src="MyLib2.js"/>
<script language="JScript">
WScript.Echo(myLib1.foo());
WScript.Echo(myLib2.bar());
</script>
</job>
Upvotes: 11
Reputation: 800
OK, I found a decent solution:
// A object to which library functions can be attached
var library = new Object;
eval((new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile("common_script_logic.js", 1).ReadAll());
// Test use of the library
library.die("Testing library");
I create an object to which I can attach my library functions. That way, I can reach code defined in my library from the calling script. Not perfect, but quite acceptable.
It would be great to see a more proper solution :-)
Upvotes: 8