Синхронизация загрузки файлов js с помощью вызовов ajax и загрузки файлов js с тегом <script> - PullRequest
0 голосов
/ 28 октября 2010
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 голосов
/ 31 марта 2011

Я не уверен, почему CASE 1 сработал для вас, но ваша проблема, кажется, заключается здесь:

$.getJSON('someurl', function(data)
{
    alert(core === this); // <----- false, 'this' refers to the function's scope
    for(key in this.all)
        alert(key);
});

«this» в javascript не совпадает с «this»в C ++ или Java

Проблема в том, что function(data){...} создает замыкание (с новым this).Таким образом, внутри этой функции this больше не ссылается на core, оно относится к области контекста, из которого она была вызвана (где-то внутри jQuery в данном случае).Вы можете исправить это, защитив this с помощью новой переменной, например, так.

var self = this;
$.getJSON('someurl', function(data) {
    for(var key in self.all){
        alert(key);
    }
});

Этот вопрос может указать вам правильное направление для демистификацииthis ключевое слово в javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...