layui模块的私有性依赖闭包封装与不导出,exports()仅支持同步导出对象,第二个参数必须为对象,内部未挂载到exports的变量和函数即为私有。

layui.define里exports()只暴露对象,不支持私有作用域隔离
模块内所有变量默认都是函数作用域内的局部变量,exports()只是把传入的对象挂到全局layui命名空间下,它本身不提供“私有方法”概念。所谓“隐藏”,靠的是闭包封装 + 不往exports对象里挂名。
导出公共API必须用exports(),且只能传对象
你不能直接exports('mymodule', function(){})导出函数,也不能exports('mymodule', 'string')——exports第二个参数必须是对象。常见错误是写成exports('mymodule', mod.init),结果调用时layui.mymodule()报错is not a function。
- 正确写法:
exports('mymodule', { init: function(){}, destroy: function(){} }) - 模块内部可定义任意变量或函数,只要不塞进
exports对象,外部就访问不到 - 依赖的模块(如
['jquery', 'layer'])只在回调函数内可用,不会污染全局
私有方法靠闭包 + 不导出,不是靠命名约定
别指望加个下划线前缀(比如_helper)就能“隐藏”——只要它被挂到了exports对象上,就等于公开了。真正私有的写法是:把它写在define回调内部、但不赋值给exports对象的任何属性。
示例:
layui.define(['jquery'], function(exports) {
// 私有工具函数:只在本模块内可用
function _formatDate(date) {
return date.toISOString().split('T')[0];
}
// 私有状态变量
var _cache = {};
// 公共 API:只暴露需要被外部调用的部分
var api = {
render: function(data) {
_cache.last = data; // 可读写私有变量
return _formatDate(new Date()); // 可调用私有函数
},
clear: function() {
_cache = {};
}
};
exports('mytable', api); // 只导出 api 对象
});
容易踩的坑:this指向、模块重载、循环依赖
模块函数体内this指向window,不是模块实例;多次layui.use(['mytable'])不会重复执行define回调(Layui自动缓存),但若手动删掉layui.mytable再use,会重新执行——此时私有变量_cache会被重置,这点常被忽略。
- 不要在模块顶层写
console.log(this)来调试,它永远是window - 避免在
define回调里发起异步请求并直接操作exports对象,因为exports必须同步完成 - Layui不支持循环依赖检测,
A define(['B'])+B define(['A'])会导致undefined,需靠人工拆解
exports那个对象里的每一个键。大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











