使用ajax调用同步加载js文件并使用<script>标记</script>加载js文件

时间:2010-10-28 02:19:30

标签: javascript ajax javascript-events jquery

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中进行调试时,我注意到使用断点解决了问题)...有什么我缺少的吗?

1 个答案:

答案 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关键字的神秘面纱。