跨独立JavaScript文件调用函数报getLocaleDateString未定义如何解决
问题底层原因解析
- 闭包作用域隔离规则限制
JavaScript中函数内部声明的函数默认属于当前函数的私有作用域成员,仅能在内部访问,无法被外部作用域读取。你最初的getLocaleDateString定义在匿名闭包内部,属于私有函数,自然无法在另一个JS文件的全局作用域下被调用。你直接把这段函数代码复制到sys.datepicker.js中时,两个函数处于同一个作用域下,不存在跨作用域访问限制,所以可以正常运行。 - 初始包裹代码本身未执行
你写的匿名函数仅完成了定义,末尾没有添加()触发执行,哪怕你在闭包内手动将函数挂载到全局,这段包裹代码本身都不会运行,函数连定义的流程都不会触发,自然无法对外暴露。 - 仅注释闭包代码会引发语法错误
仅注释闭包的首尾行无法解决语法冲突:注释开头的(function ($) {后,末尾残留的}和)会成为无效语法,触发JS文件解析失败,getLocaleDateString仍然不会被注册到全局作用域,必须物理删除整个闭包的包裹代码,让函数直接声明在全局作用域下,两个加载顺序正确的JS文件共享全局作用域,才能正常调用。
如果要保留闭包避免全局污染,也可以在闭包内手动将函数挂载到全局对象,同时补全执行逻辑即可:
(function ($) { function getLocaleDateString() { const formats = { "af-ZA": "yyyy/MM/dd", "zu-ZA": "yyyy/MM/dd", }; return formats[navigator.language] || "dd/MM/yyyy"; } // 挂载到全局对象 window.getLocaleDateString = getLocaleDateString; // 末尾加()触发闭包执行 })(jQuery)
内容的提问来源于stack exchange,提问作者Ross Symonds
相关产品推荐
相关产品推荐

