jQuery.load()加载的HTML内调用页面全局函数报undefined原因问询
问题原因分析
- 最常见的场景是你定义的
foo实际不是全局作用域下的函数。多数开发者习惯把JS代码包裹在$(function() {})、DOMContentLoaded回调或者自执行匿名函数(IIFE)中,这种情况下定义的foo属于闭包内的局部函数,不会自动挂载到全局window对象上,异步加载的脚本执行时自然访问不到。
你可以打开浏览器控制台输入window.foo验证,如果输出为undefined就属于该情况,只需要把foo的定义修改为window.foo = function() { console.log("foo") }即可解决。 - 如果你给引入app.js的script标签加了
type="module"属性也会出现该问题。ES Module的顶层作用域是模块自身而非全局作用域,模块内定义的顶层函数默认不会暴露到全局,同样需要手动赋值给window.foo才能被外部访问。 - 少数情况是脚本执行时序问题。如果app.js的加载晚于
.load方法返回的内嵌脚本执行时机(比如app.js引入位置在页面底部、加了defer/async属性,且你在页面加载初期就调用了.load),也会出现执行foo()时函数还未定义的问题。
这种情况可以在.load的回调中打印window.foo验证,如果回调中能拿到foo的值,说明是内嵌脚本执行时机过早导致的,可以把内嵌脚本的逻辑放到.load的回调中执行。
内容的提问来源于stack exchange,提问作者odiszapc
相关产品推荐
相关产品推荐

