core.js:
var core =
{
all:{},
load: function(jsUrl)
{
$.ajaxStup({async, false});
$.getScript(jsUrl);
},
init: function ()
{
$.getJSON('someurl', function(data)
{
for(key in this.all)
alert(key);
});
},
here: function(who)
{
this.all[who.name] = who;
}
};
$(document).ready(function()
{
core.init();
});
me.js
(function()
{
core.here({name:"me", foo:"bar"});
})();
CASE 1:
<script type="text/javascript" src="/jquery.js"></script>
<script type="text/javascript" src="/core.js"></script>
<script type="text/javascript">
core.load("/me.js");
</script>
CASE 2:
<script type="text/javascript" src="/jquery.js"></script>
<script type="text/javascript" src="/core.js"></script>
<script type="text/javascript" src="/me.js"></script>
问题在于,对于案例1,我得到了警报,但是对于案例2,没有警报...... 所以问题是:标签有一个加载事件?或者我可以使用什么来同步文件以便在案例2中工作(在IE8中进行调试时,我注意到使用断点解决了问题)...有什么我缺少的吗?
答案 0 :(得分:0)
我不确定为什么CASE 1碰巧适合你,但你的问题似乎就在这里:
$.getJSON('someurl', function(data)
{
alert(core === this); // <----- false, 'this' refers to the function's scope
for(key in this.all)
alert(key);
});
javascript中的“this”与C ++或Java中的“this”不同
问题是function(data){...}
创建了一个闭包(使用新的闭包)。因此,在该函数中,this
不再引用core
,它指的是调用它的上下文的范围(在这种情况下,jQuery中的某个地方)。您可以使用新变量保护 this
来解决此问题。
var self = this;
$.getJSON('someurl', function(data) {
for(var key in self.all){
alert(key);
}
});
This question可以指明您在javascript中揭开this
关键字的神秘面纱。