【问题标题】:How to dynamically load javascript function (with Ajax in Dojo) with arguments如何使用参数动态加载 javascript 函数(在 Dojo 中使用 Ajax)
【发布时间】:2011-07-20 23:26:19
【问题描述】:

我正在实现一个 require/load 函数,该函数检索并执行一段远程 javascript 代码。它工作正常,我正在使用一种解决方法,通过基本上声明全局变量来为其提供参数,但我想知道在这种情况下传递参数的最佳方式是什么。这是加载远程脚本的函数

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 在什么上下文中执行?如果它在函数Module.require 的范围内,那么我可以很容易地参考args。如果它在全局范围内执行(window),那么我知道如何声明局部变量(匿名函数调用(function(){}());),但我如何传递参数?我希望有一种简单的方法可以做到这一点,因为我不希望将所有参数都传递给服务器。通过 PHP 不仅难以解析它们,而且代码中可能存在许多参数。

编辑:James Khoury 提到了我如何使用f.apply() 和f.call() 来传递参数,所以我现在需要知道的是脚本在执行时加载的上下文。如果它在函数的范围内,我想我可以这样称呼它f.call(this , args);。如果我能做到这一点,是否有调用匿名函数的方法?我问是因为我正在创建包装用户代码的模块,以确保用户声明的所有变量都保持在本地,因此,最好确保包装函数也不是全局的。

谢谢

【问题讨论】:

    标签: javascript ajax dojo scope


    【解决方案1】:

    我会同时查看function .call and function .apply

    var obj = { x: 15 };
    f.call(obj)
    
    var args = ["hello", 2, {data: "123"}];
    
    f.apply(obj, args);
    

    (取自odetocode.com)

    然后在你的函数f():

    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); 
        }
    
    }
    

    【讨论】:

    • James,是 function f(message, num. dataObj) 一个错字,或者是 num。 --space-- dataObj 应该在那里。
    • 对此我还有两个问题,所以我将编辑问题
    • @puk 您可以将局部变量附加到一个对象,然后 anonFunction.apply(context, arguments) 然后可以访问变量 this.myVar 或只是 myVar... 在全局范围内 widow 是与this 相同。 (是的,这是一个错字谢谢)
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2010-11-14
    • 2012-08-07
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多