Как ссылаться на JScript файл с другого?

Я пишу некоторые серверные скрипты, используя JScript и WSH. Сценарии становятся довольно длинными, а некоторые общие функции и переменные лучше вписываются в общую библиотеку script, которую я включил в свои различные экземпляры script.

Но я не могу найти способ ссылки на один JScript файл из другого. На мгновение я прочитал содержимое файла и передал его в eval(). Но, как говорится в MSDN:

Обратите внимание, что новые переменные или типы, определенные в инструкции eval, не отображаются в прилагаемой программе.

Можно ли включить/связать файл JScript с другим?

Ответ 1

Попробуйте использовать Windows Script Файл. Это в основном XML-документ, который позволяет включать в себя несколько файлов Script и, кроме всего прочего, определять несколько заданий.

<!-- 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>

Ответ 2

ОК, я нашел достойное решение:

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

Я создаю объект, к которому я могу прикрепить свои библиотечные функции. Таким образом, я могу получить код, определенный в моей библиотеке, из вызывающего script. Не идеально, но вполне приемлемо.

Было бы здорово увидеть более правильное решение: -)

Ответ 3

На основе решения Томаса - здесь аналогичный, но более модульный подход. Во-первых, script для вызова (извините мой стиль кодирования):

/* include.js */
(function () {
    var L = {/* library interface */};
    L.hello = function () {return "greetings!";};
    return L;
}).call();

Затем в вызывающем script:

var Fs = new ActiveXObject("Scripting.FileSystemObject");
var Lib = eval(Fs.OpenTextFile("include.js", 1).ReadAll());
WScript.echo(Lib.hello()); /* greetings! */

Библиотеки, определенные таким образом, не производят или не полагаются на какие-либо значения, но eval будет возвращать любое значение, которое он получает от окружающей анонимной функции в библиотеке.