【发布时间】:2013-01-14 08:55:07
【问题描述】:
我正在使用一个使用 jsonP 来共享跨域信息的脚本。 它运作良好,但我需要将其放入 IIFE。
var domain = "http://example.com/";
var myObj = {
recupData : function(data){
if (data.id) {
console.log(data.id);
}
},
scriptTag : function() {
var siteOrigin = domain+"check?q=myObj.recupData",
script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = siteOrigin;
document.getElementsByTagName('HEAD')[0].appendChild(script);
}
}
myObj.scriptTag();
这行得通! (我只使用了我的全局脚本的一小部分,只是为了向您展示结构,所以如果那里有任何语法错误,那不是重点)。
但是当我把这段代码放在一个 IIFE(一个自调用函数)中时,我遇到了一些麻烦。
(function(){
var domain = "http://example.com/";
var myObj = {
recupData : function(data){
if (data.id) {
console.log(data.id);
}
},
scriptTag : function() {
var siteOrigin = domain+"check?q=myObj.recupData",
script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = siteOrigin;
document.getElementsByTagName('HEAD')[0].appendChild(script);
}
}
myObj.scriptTag();
})();
我收到错误 myObj 未定义,错误来自 scriptTag 方法,我真的不明白为什么在添加 IIFE 之前我无法访问此方法,它不应该改变任何东西,它只是避免污染全局命名空间。 我认为这只是一个上下文问题,但我需要一个解释。
【问题讨论】:
-
@apsillers 是的,这是个好字符串,当你告诉我的回调不使用 myObj 时,你是什么意思?
-
错误是在脚本附加之后还是之前出现?您附加的脚本代码是否引用了
myObj? -
@JAAulde 是的,脚本标签是在我收到错误之前创建的。我只是创建一个 http 请求以从另一个服务器域获取数据。
标签: javascript namespaces scope iife