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"}); })();
PŘÍPAD 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>
PŘÍPAD 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>
Problém je v tom, že v případě 1 dostanu upozornění, jak bych měl, ale v případě 2 žádné upozornění…
Otázka tedy zní:pro <script>
existuje událost zatížení štítek? Co mohu použít k synchronizaci souborů, aby fungovaly v případě 2 (při ladění v IE8 jsem si všiml, že problém řeší použití bodu přerušení)? Je něco, co mi chybí?
Odpověď
Nejsem si jistý, proč vám CASE 1 náhodou fungoval, ale zdá se, že váš problém spočívá zde:
$.getJSON('someurl', function(data) { alert(core === this); // <----- false, 'this' refers to the function's scope for(key in this.all) alert(key); });
„toto“ v javascriptu není totéž jako „toto“ v C++ nebo Java
Problém je v tom, že function(data){...}
vytvoří uzávěr (s novým this). Takže uvnitř této funkce je this
již neodkazuje na core
, odkazuje na rozsah kontextu, ze kterého byl volán (v tomto případě někde uvnitř jQuery). Můžete to opravit ochranou this
s novou proměnnou, podobně.
var self = this; $.getJSON('someurl', function(data) { for(var key in self.all){ alert(key); } });
Tato otázka vás může nasměrovat správným směrem k demystifikaci this
klíčové slovo v javascriptu.