2

我有一个 Curl.js 模块定义为:

define("Portfolio", ["jquery"], function(jquery) {
var $ = jquery;

var Portfolio = (function() {
    $("#output").text("Getting Stuff");
    var name = "";
    var holdings = [];

    return {
        "stupid": function() {
            $.getScript("app/myScript.js", function(dog) {
                //var dog = new Dog();
                dog.speak();
            }).fail(function(jqxhr, settings, exception) {
                console.log(exception);
            });
        }
    }
})();

return Portfolio;
});

/app/myScript.js 看起来像这样:

(function() {

var breed = "Poodle";
return {
    speak: function() {
        alert("Woof");
    }
};
})();

我在 Chrome 的控制台中调用“愚蠢”方法,如下所示:

curl(['Portfolio'], function(Portfolio){
Portfolio.stupid();
});

Chrome 说:

Uncaught TypeError: Object (function() {

var breed = "Poodle";
return {
    speak: function() {
        alert("Woof");
    }
};
})(); has no method 'speak'

在 myScript.js 中,我可以使用var Dog = (function(){....})();which 会起作用,但我不想那样污染全局命名空间。

我也可以function Dog(){....}在我的 getScript 回调中使用 and ,new Dog().speak()但是 Dog 不会是一个模块,因为我将拥有私有属性,并且它也将绑定到全局范围。

似乎 $.getScript() 没有将调用的脚本的返回值绑定到任何可从 getScript() 的回调函数访问的变量;至少我找不到。它确实返回数据,但这只是调用的脚本的文本。我确实找到了一个作弊器,我可以获取返回的脚本并运行它eval()。奇怪的是,这几乎正是 $.getScript() 方法本身所做的。将 Stupid 方法重写为以下代码:

"stupid": function() {
    $.get("/app/myScript.js", function(Dog) {
        var dog = new (eval(Dog));
        console.log("Breed:" + dog.getBreed());
        d.setBreed("Lab");
        console.log("Breed: " + dog.getBreed());
    });
}

这确实有效,但感觉有点笨拙和错误。

如何使用 getScript() 调用编写为模块或匿名自执行函数的 /app/myScript.js,然后调用返回的函数之一?getScript 应该执行我认为的脚本,正如我所写的那样,将一个对象绑定返回给我可以调用的 getScript 返回对象?显然我在这里遗漏了一些东西。

为什么你不工作 Javascript?

4

1 回答 1

1

如果一旦你使用 curl.js,最好忘记 JQuery.getScript() 阅读 curl 的 wiki!

于 2013-12-03T00:17:27.580 回答