我正在使用JScript和WSH编写一些服务器端脚本。这些脚本变得相当长,一些常见的函数和变量将更适合于放在通用库脚本中,然后在各个脚本实例中包含。
但是,我找不到一种方法可以引用另一个JScript文件。一度想过读取文件内容并将其传递给eval()
,但正如MSDN所说:
请注意,eval语句中定义的新变量或类型对封闭程序不可见。
有没有办法在一个JScript文件中引用/包含另一个文件?
我正在使用JScript和WSH编写一些服务器端脚本。这些脚本变得相当长,一些常见的函数和变量将更适合于放在通用库脚本中,然后在各个脚本实例中包含。
但是,我找不到一种方法可以引用另一个JScript文件。一度想过读取文件内容并将其传递给eval()
,但正如MSDN所说:
请注意,eval语句中定义的新变量或类型对封闭程序不可见。
有没有办法在一个JScript文件中引用/包含另一个文件?
试着使用 Windows Script 文件。它基本上是一个 XML 文档,允许您包括多个脚本文件和定义多个作业,以及其他一些功能。
<!-- 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>
基于Thomas的解决方案,这里提供一个类似但更加模块化的方法。首先是调用脚本:
/* include.js */
(function () {
var L = {/* library interface */};
L.hello = function () {return "greetings!";};
return L;
}).call();
然后,在调用脚本中:
var Fs = new ActiveXObject("Scripting.FileSystemObject");
var Lib = eval(Fs.OpenTextFile("include.js", 1).ReadAll());
WScript.echo(Lib.hello()); /* greetings! */
通过这种方式定义的库不产生或依赖于任何upvalues,但是eval
将返回从库中匿名函数接收到的任何值。
好的,我找到了一个不错的解决方案:
// 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");