
在 servicenow 中,script include 之间无需显式导出/导入即可直接调用函数,只需通过 new classname().methodname() 实例化调用;关键前提是作用域(scope)一致且类定义正确。
在 ServiceNow 应用开发中,Script Include 是封装可复用业务逻辑的核心机制。许多开发者误以为需像 Node.js 或 ES6 模块那样使用 export/import 语法来共享函数——但 ServiceNow 平台原生不支持 JavaScript 模块语法(如 export/import)。正确的跨 Script Include 调用方式是:将目标逻辑封装为可实例化的类(Class-based Script Include),再通过构造函数创建实例并调用其方法。
✅ 正确做法示例:
假设你已创建一个名为 multiply 的 Script Include(注意:Name 字段值即为类名),代码如下:
var multiply = Class.create();
multiply.prototype = Object.extendsObject(AbstractAjaxProcessor, {
doMultiply: function(a, b) {
return a * b;
},
type: 'multiply' // 必须声明 type 属性,确保类可被识别
});⚠️ 注意:type 属性是 ServiceNow 类系统的关键标识,不可省略;若缺失,实例化时将抛出 TypeError: Cannot call method 'doMultiply' of undefined。
随后,在任意同作用域的上下文(如 Business Rule、UI Action、another Script Include 或 Flow Designer 的 Script Step)中,直接调用:
// ✅ 正确:同一应用作用域内调用
var result = new multiply().doMultiply(5, 8); // 返回 40
gs.info('Result: ' + result);? 关键前提与注意事项:
- 作用域一致性:调用方与被调用 Script Include 必须处于相同 Application Scope(例如均为 global,或同属自定义应用 x_myapp_core)。若目标 Script Include 设置为 Accessible from: This application scope only,而你在 global 范围的 Business Rule 中调用,将触发权限拒绝错误。
- 命名规范:Script Include 的 Name 字段必须与类名完全一致(区分大小写),且不能含空格或特殊字符。
- 避免全局污染:不推荐将函数挂载到 global 对象(如 window.doMultiply = ...),该方式不可靠且违反平台最佳实践。
- 异步场景处理:若方法涉及异步操作(如 GlideRecord 查询),应返回 Promise 或使用 gs.sleep()(仅限后台脚本,不推荐);前端调用(如 Client Script)需改用 AjaxClientScript 或 REST Message。
? 总结:ServiceNow 的 Script Include 天然具备“模块化”能力,其本质是基于 Prototype 的类工厂。掌握 Class.create() + type + 同 scope 实例化三要素,即可安全、高效地实现函数复用,无需任何模拟导出/导入的变通方案。










