جافا سكريبت (الكركدن) استخدام المكتبة أو تضمين البرامج النصية الأخرى

StackOverflow https://stackoverflow.com/questions/650377

  •  19-08-2019
  •  | 
  •  

سؤال

في JDK6، هل هناك طريقة لتحميل البرامج النصية متعددة، كل في ملف، ولها برنامج نصي واحد مرجع وسيلة لالنصي آخر؟ نوع من مثل "تشمل"؟

هل كانت مفيدة؟

المحلول

وأعتقد أنك بعد الأسلوب تحميل () / الملكية من العالمية الكركدن الكائن / نطاق

load("file1.js");
load("file2.js");
load("file3.js");

methodFromFileOne();
var bar = methodFromFileTwo();
var etc = dotDotDot();

وهذا سيتم تحميل ملف مصدر جافا سكريبت، مماثل لكيفية تشمل / تتطلب إرادة في PHP. بمجرد تحميل الملف، عليك أن تكون قادرا على الاتصال وظيفة أو استخدام أي كائن محدد في ملف تحميل.

وهذه هي الطريقة التي تسير بها الأمور عندما كنت تستخدم الكركدن قذيفة، وهو السياق الوحيد الذي أعرفه (ذكر سؤالك SDK جافا، والتي هي خارج منطقتي الخبرة)

نصائح أخرى

وإذا كنت يحدث ليكون تحاول القيام بذلك في غضون النمل، قد تشاهد هذا الخطأ:

<script language="javascript">
    load('foo.js');
</script>
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function load.

ولكن يمكنك تجنب ذلك:

<script language="javascript">
    eval(''+new String(org.apache.tools.ant.util.FileUtils.readFully(new java.io.FileReader('foo.js'))));
</script>

وهناك واقع الحياة المثال هذا الوقت، أي تشغيل esprima محلل مع الكركدن 1.7R4.

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;
...

Context context = Context.enter();
Scriptable globalScope = context.initStandardObjects();
Reader esprimaLibReader = new InputStreamReader(getClass().getResourceAsStream("/esprima.js"));
context.evaluateReader(globalScope, esprimaLibReader, "esprima.js", 1, null);

// Add a global variable out that is a JavaScript reflection of the System.out variable:
Object wrappedOut = Context.javaToJS(System.out, globalScope);
ScriptableObject.putProperty(globalScope, "out", wrappedOut);

String code = "var syntax = esprima.parse('42');" +
    "out.print(JSON.stringify(syntax, null, 2));";

// The module esprima is available as a global object due to the same
// scope object passed for evaluation:
context.evaluateString(globalScope, code, "<mem>", 1, null);
Context.exit();

وبعد تشغيل هذا الرمز، يجب أن يظهر الإخراج كما يلي:

{
  "type": "Program",
  "body": [
    {
      "type": "ExpressionStatement",
      "expression": {
        "type": "Literal",
        "value": 42,
        "raw": "42"
      }
    }
  ]
}

وهكذا في الواقع، هو خدعة في إعادة استخدام الكائن globalScope.

وطالما كنت تستخدم نفس النطاق لتنفيذ كل ملف، وأنها ستكون قادرة على الرجوع وظائف والمتغيرات من الملفات المنفذة سابقا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top