如何从另一个JScript文件中引用一个JScript文件?

13

我正在使用JScript和WSH编写一些服务器端脚本。这些脚本变得相当长,一些常见的函数和变量将更适合于放在通用库脚本中,然后在各个脚本实例中包含。

但是,我找不到一种方法可以引用另一个JScript文件。一度想过读取文件内容并将其传递给eval(),但正如MSDN所说:

请注意,eval语句中定义的新变量或类型对封闭程序不可见。

有没有办法在一个JScript文件中引用/包含另一个文件?


请注意,eval语句中定义的新变量或类型对封闭程序不可见。至少对于WSH来说是这样的:https://dev59.com/W3jZa4cB1Zd3GeqPhLEB#19747677 - T.J. Crowder
3个回答

11

试着使用 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>

好主意,谢谢! 但是我认为暂时我还是会坚持我的解决方法。看起来比WSH文件更方便一些。 - Thomas Svensen
非常好!现在我只需要等待运行此程序的计算机升级即可。它仍在运行WSH 5.7...:\ 显然,此功能仅在5.8中实现。 - exhuma
1
我认为需要注意的是,这使得在没有Visual Studio的情况下进行调试变得更加复杂。 - bshacklett

11

基于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将返回从库中匿名函数接收到的任何值。


这个很好用。唯一的缺点是包含的库不能导入任何系统库。如果所包含的库需要一个系统库,那么导入语句需要在调用脚本中进行。 - Aaron Cicali

8

好的,我找到了一个不错的解决方案:

// 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");

我创建了一个对象,可以将我的库函数附加到该对象上。这样,我就可以从调用脚本中访问在我的库中定义的代码。虽然不完美,但是相当可接受。
看到更好的解决方案肯定会很棒 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接