如何使用参数动态加载javascript函数(在Dojo中使用Ajax)
我正在实现一个require/load函数,它检索并执行一段远程javascript代码。它工作得很好,我正在使用一种变通方法,通过基本上声明全局变量来为它提供参数,但我想知道在这种情况下传递参数的最佳方式是什么。下面是加载远程脚本的函数如何使用参数动态加载javascript函数(在Dojo中使用Ajax),javascript,ajax,dojo,scope,Javascript,Ajax,Dojo,Scope,我正在实现一个require/load函数,它检索并执行一段远程javascript代码。它工作得很好,我正在使用一种变通方法,通过基本上声明全局变量来为它提供参数,但我想知道在这种情况下传递参数的最佳方式是什么。下面是加载远程脚本的函数 Module.require = function (moduleName , args){ if (! Module.has(moduleName)){ dojo.xhrGet({ url: 'module.r
Module.require = function (moduleName , args){
if (! Module.has(moduleName)){
dojo.xhrGet({
url: 'module.require.php',
handleAs: "javascript",
content : {
module : moduleName
},
load: function() {
},
error: function(errorMessage) {
console.log('there was an error with Module.require()');
console.error(errorMessage);
}
});
}
};
我的第一个问题是,当获取并动态执行存储在moduleName.js
中的代码时,执行moduleName
的上下文是什么?如果它在函数模块.require的范围内,那么我可以很容易地参考args
。如果它是在全局范围(窗口
)中执行的,那么我知道如何声明局部变量(匿名函数调用(function(){}());
),但是如何传递参数呢?我希望有一个简单的方法来做到这一点,因为我不希望将所有的参数传递给服务器。不仅很难通过PHP解析它们,而且代码中可能有许多参数
EDIT:James Khoury提到了如何使用f.apply()
和f.call()
来传递参数,因此我现在需要知道的是脚本在执行时加载的上下文。如果它在函数的范围内,我想我可以像这样调用它f.call(this,args)代码>。如果我能做到这一点,是否还有调用匿名函数的方法?我这样做是因为我正在创建包装用户代码的模块,以确保用户声明的所有变量都保持本地,因此,最好确保包装函数也不是全局的
谢谢我两个都看
(这是取自)
然后在函数f()
中:
函数f(消息、数值、数据对象)
{
如果(此.x)
{
警报(this.x);
//或者,您可以只执行alert(x);
}
如果(arguments.length>2)
{
dataObj[“消息”]=“”
对于(变量i=0;i
我会同时考虑这两个问题
(这是取自)
然后在函数f()
中:
函数f(消息、数值、数据对象)
{
如果(此.x)
{
警报(this.x);
//或者,您可以只执行alert(x);
}
如果(arguments.length>2)
{
dataObj[“消息”]=“”
对于(变量i=0;i
James,是函数f(message,num.dataObj)
打字错误,还是num.--space--dataObj应该在那里。关于这一点,我还有两个问题,所以我将编辑question@puk您可以将局部变量附加到一个对象,然后anonFunction.apply(上下文、参数)
然后可以访问变量this.myVar
或仅myVar
。。。在全局范围内,寡妇
与此
相同。(是的,这是一个输入错误,谢谢)James,函数f(message,num.dataObj)
是一个输入错误,还是num.--space--dataObj应该在那里。关于这一点,我还有两个问题,所以我将编辑question@puk您可以将局部变量附加到一个对象,然后anonFunction.apply(上下文、参数)
然后可以访问变量this.myVar
或仅myVar
。。。在全局范围内,寡妇
与此
相同。(是的,这是一个打字错误,谢谢)
var obj = { x: 15 };
f.call(obj)
var args = ["hello", 2, {data: "123"}];
f.apply(obj, args);
function f(message, num, dataObj)
{
if (this.x)
{
alert(this.x);
// Alternatively you could just do alert(x);
}
if(arguments.length > 2)
{
dataObj["message"] = ""
for(var i =0; i < num; i++)
{
dataObj["message"] += message + "\n";
}
alert(dataObj.message + "\n" + dataObj.data);
}
}