Как динамически загрузить функцию javascript (с Ajax в Dojo) с аргументами - PullRequest
1 голос
/ 21 июля 2011

Я реализую функцию 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, когда код, сохраненный в moduleName.js, выбирается и выполняется динамически? Если это входит в область действия функции Module.require, то я легко могу сослаться на args. Если он выполняется в глобальной области видимости (window), тогда я знаю, как объявлять локальные переменные (анонимный вызов функции (function(){}());), но как передать аргументы? Я надеюсь, что есть простой способ сделать это, так как я не хочу передавать все аргументы на сервер. Не только трудно разобрать их через PHP, но и в коде может быть много аргументов.

РЕДАКТИРОВАТЬ : Джеймс Хури упомянул, как я могу использовать f.apply() и f.call() для передачи аргументов, поэтому сейчас мне нужно знать, в каком контексте скрипт загружается при выполнении. Если это входит в сферу действия функции, я полагаю, что могу назвать ее так: f.call(this , args);. И если я могу сделать это, в любом случае, чтобы вызвать анонимную функцию? Я спрашиваю, потому что я создаю модули, которые обертывают код пользователя, чтобы гарантировать, что все переменные, которые пользователь объявляет, остаются локальными, поэтому было бы лучше убедиться, что функция-обертка также не является глобальной.

Спасибо

1 Ответ

1 голос
/ 21 июля 2011

я бы посмотрел на функцию .call и функцию .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); 
    }

}
...