Вызов динамической функции с динамическими параметрами в Javascript [дубликат]



этот вопрос уже есть ответ здесь:



Я ищу подвох в этом. Я знаю, как вызвать динамическую, произвольную функцию в Javascript, передавая определенные параметры, что-то вроде этого:



function mainfunc (func, par1, par2){
window[func](par1, par2);
}

function calledfunc(par1, par2){
// Do stuff here
}

mainfunc('calledfunc','hello','bye');


Я знаю, как передать необязательные, неограниченные параметры с помощью аргументов [] коллекция внутри mainfunc, но я не могу понять как отправить произвольное количество параметров для mainfunc для отправки в calledfunc динамически; как я могу сделать что-то вроде это, но с любым количеством необязательных аргументов (не используя этот уродливый Если-нибудь)? :



function mainfunc (func){
if(arguments.length == 3)
window[func](arguments[1], arguments[2]);
elseif(arguments.length == 4)
window[func](arguments[1], arguments[2], arguments[3]);
elseif(arguments.length == 5)
window[func](arguments[1], arguments[2], arguments[3], arguments[4]);
}

function calledfunc1(par1, par2){
// Do stuff here
}

function calledfunc2(par1, par2, par3){
// Do stuff here
}

mainfunc('calledfunc1','hello','bye');
mainfunc('calledfunc2','hello','bye','goodbye');
490   10  

10 ответов:

используйте метод apply функции: -

function mainfunc (func){
    window[func].apply(null, Array.prototype.slice.call(arguments, 1));
} 

Edit: мне кажется, что это было бы гораздо полезнее с небольшой настройкой:-

function mainfunc (func){
    this[func].apply(this, Array.prototype.slice.call(arguments, 1));
} 

это будет работать вне браузера (this по умолчанию используется глобальное пространство). Использование вызова на mainfunc также будет работать: -

function target(a) {
    alert(a)
}

var o = {
    suffix: " World",
    target: function(s) { alert(s + this.suffix); }
};

mainfunc("target", "Hello");

mainfunc.call(o, "target", "Hello");

ваш код работает только для глобальных функций, т. е.. члены

вы могли бы использовать .apply()

необходимо указать this... Я думаю, вы могли бы использовать this внутри mainfunc.

function mainfunc (func)
{
    var args = new Array();
    for (var i = 1; i < arguments.length; i++)
        args.push(arguments[i]);

    window[func].apply(this, args);
}

вот что вам надо:

function mainfunc (){
    window[Array.prototype.shift.call(arguments)].apply(null, arguments);
}

первый аргумент используется в качестве имени функции, а все остальные используются в качестве аргументов для вызываемой функции...

мы можем использовать shift метод для возврата и последующего удаления первого значения из массива аргументов. Обратите внимание, что мы вызвали его из прототипа массива, поскольку, строго говоря, "аргументы" не являются реальным массивом и поэтому не наследуют shift метод как обычный массив бы.


вы также можете вызвать метод shift следующим образом:

[].shift.call(arguments);

самый простой способ может быть:

var func='myDynamicFunction_'+myHandler;
var arg1 = 100, arg2 = 'abc';

window[func].apply(null,[arg1, arg2]);

предполагая, что целевая функция уже присоединена к объекту "окно".

Если вы хотите передать с "аргументами" несколько других, вы должны создать массив всех аргументов вместе, т. е. так:

var Log = {
    log: function() {
        var args = ['myarg here'];
        for(i=0; i<arguments.length; i++) args = args.concat(arguments[i]);
        console.log.apply(this, args);
    }
}

теперь я использую это:

Dialoglar.Confirm = function (_title, _question, callback_OK) {
    var confirmArguments = arguments;
    bootbox.dialog({
        title: "<b>" + _title + "</b>",
        message: _question,
        buttons: {
            success: {
                label: "OK",
                className: "btn-success",
                callback: function () {
                    if (typeof(callback_OK) == "function") {                            callback_OK.apply(this,Array.prototype.slice.call(confirmArguments, 3));
                    }
                }
            },
            danger: {
                label: "Cancel",
                className: "btn-danger",
                callback: function () {
                    $(this).hide();
                }
            }
        }
    });
};
function a(a, b) {
    return a + b
};

function call_a() {
    return a.apply(a, Array.prototype.slice.call(arguments, 0));
}

console.log(call_a(1, 2))

не могли бы вы просто передать arguments массива?

function mainfunc (func){
    // remove the first argument containing the function name
    arguments.shift();
    window[func].apply(null, arguments);
}

function calledfunc1(args){
    // Do stuff here
}

function calledfunc2(args){
    // Do stuff here
}

mainfunc('calledfunc1','hello','bye');
mainfunc('calledfunc2','hello','bye','goodbye');

в случае, если кто-то еще ищет динамический вызов функции с динамическими параметрами -

callFunction("aaa('hello', 'world')");

    function callFunction(func) {
                try
                {
                    eval(func);
                }
                catch (e)
                { }
            }
    function aaa(a, b) {
                alert(a + ' ' + b);
            }

Comments

    Ничего не найдено.