jQuery的getScript - 包括进入主范围的文件?

Ind*_*ial 2 jquery eval getscript backbone.js

我已经考虑过如何在backbone.js-application中包含文件.在生产中,我显然会加入我的文件并最小化它们以保持最低要求,但在开发过程中,只需加载所有文件并且不必为每一个小变化调用一个buildscript就好了.

所以我看了一下jQuery' getScript()方法.我尝试了,并能够加载我的文件.

当我将getScript-call放入一个函数时,为了确保在我启动backbone.js应用程序之前加载文件,似乎每个加载的脚本都不包含在全局范围内.

var loader = function () {
     var scripts = ['/app/routers/myrouter.js'];

     for (var i = 0; i < scripts.length; i++) {
         $.getScript(scripts[i], function () {});
     }

     console.log(myrouter); // Works - myrouter is a function
     init(); // Callback - we've loaded all scripts
 };

var init = function () {
    console.log(myrouter); // myrouter is undefined
};

$(document).ready(loader());
Run Code Online (Sandbox Code Playgroud)

Esa*_*ija 6

首先,你只是调用loader()而不是传递函数:

$(document).ready(loader);
Run Code Online (Sandbox Code Playgroud)

将解决这个问题

其次,您正在调用init回调,而不是在加载所有脚本时.如果有许多脚本,您需要使用promises:

    var scripts = ['/app/routers/myrouter.js'];
    for (var i = 0; i < scripts.length; i++) {
        scripts[i] = $.getScript(scripts[i]);
    }


    $.when.apply( $, scripts ).then( init, function(){
        "some script failed";
    });
Run Code Online (Sandbox Code Playgroud)

上面使用的语法是$.when( promise1, promise2, ...).then( successCallback, failureCallback)- 我们用promises填充数组并使用.apply它们作为参数.

http://api.jquery.com/jQuery.when/

http://api.jquery.com/Deferred.then/