我有一个 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?