SuiteScript中模块导入报错:第一种‘头文件’写法为何失效?
问题描述
我具备C语言开发背景,因此使用“头文件”和“源文件”的术语。我看到网上多数示例采用如下格式:
头文件(GlobalFunctions.js):
/** * @file Sample Server Utilities module. * * @NApiVersion 2.1 * @NModuleScope Public * * Global Functions used throughout several JavaScript files in all projects */ // GlobalFunctions.js define(['N/log'], function(log) { function log_detail(string) { log.debug("test title", string); } return { log_detail: log_detail }; });
源文件(source.js):
/** * @NApiVersion 2.1 * @NScriptType UserEventScript * */ // source.js define(['N/log', './GlobalFunctions'], (log, global_functions) => { var log_detail = global_functions.log_detail; // 为方便使用给库导入起别名... log_detail("test"); .......
但我遇到如下错误:
TypeError: Cannot read property 'log_detail' of undefined
而若采用如下“头文件”库文件写法则可正常运行:
/** * @file Sample Server Utilities module. * * @NApiVersion 2.1 * @NModuleScope Public * * Global Functions used throughout several JavaScript files in all projects */ define(['N/log'], function(log) { var globalFunctions = { log_detail: function(string) { log.debug(string, string); } } return globalFunctions; });
请问我在第一种头文件写法中哪里出错了?
问题解答
问题出在JavaScript的自动分号插入(ASI)机制上:
在第一种写法里,return语句后面直接换行了:
return { log_detail: log_detail };
JavaScript会自动在return末尾插入分号,等价于:
return; { log_detail: log_detail };
这导致你的模块实际返回了undefined,后续源文件里导入的global_functions就是undefined,自然会抛出Cannot read property 'log_detail' of undefined的错误。
第二种写法里,return后面直接跟了变量globalFunctions,没有换行触发ASI的问题,所以模块正确导出了包含log_detail方法的对象,源文件就能正常访问。
解决第一种写法的问题很简单,把return和后面的对象字面量放在同一行,或者用括号包裹对象:
// 写法1:同一行 return { log_detail: log_detail }; // 写法2:用括号包裹 return ( { log_detail: log_detail } );
内容的提问来源于stack exchange,提问作者NeverSuite
相关产品推荐
相关产品推荐

