IT story

동적 개수의 매개 변수를 사용하여 동적 함수 호출

hot-time 2020. 6. 14. 09:51
반응형

동적 개수의 매개 변수를 사용하여 동적 함수 호출


나는 이것에 대한 트릭을 찾고 있습니다. JavaScript에서 동적이고 임의의 함수를 호출하고 다음과 같은 특정 매개 변수를 전달하는 방법을 알고 있습니다.

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

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

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

arguments내부 컬렉션을 사용하여 선택적 무제한 매개 변수를 전달하는 방법을 알고 mainfunc있지만 임의의 수의 매개 변수를 mainfunc전송하여 calledfunc동적으로 전송하는 방법을 알 수는 없습니다 . 어떻게 이런 옵션을 수행 할 수 있지만 여러 가지 선택적 인수를 사용하여 (그 못생긴 if–을 사용하지 않음 else)?

function mainfunc(func){
    if(arguments.length == 3)
        window[func](arguments[1], arguments[2]);
    else if(arguments.length == 4)
        window[func](arguments[1], arguments[2], arguments[3]);
    else if(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');

함수의 적용 방법을 사용하십시오.

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

편집 : 이것은 약간의 조정으로 훨씬 더 유용 할 것입니다.

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

코드는 전역 기능, 즉 작동합니다. window객체의 멤버 . 임의의 함수와 함께 사용하려면 이름 대신 함수 자체를 문자열로 전달하십시오.

function dispatch(fn, args) {
    fn = (typeof fn == "function") ? fn : window[fn];  // Allow fn to be a function object or the name of a global function
    return fn.apply(this, args || []);  // args is optional, use an empty array by default
}

function f1() {}

function f2() {
    var f = function() {};
    dispatch(f, [1, 2, 3]);
}

dispatch(f1, ["foobar"]);
dispatch("f1", ["foobar"]);

f2();  // calls inner-function "f" in "f2"
dispatch("f", [1, 2, 3]);  // doesn't work since "f" is local in "f2"

당신은 사용할 수 있습니다 .apply()

를 지정해야합니다 . 내부를 this사용할 수있을 것 같습니다 .thismainfunc

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

첫 번째 인수는 함수 이름으로 사용되며 나머지 모든 인수는 호출 된 함수에 대한 인수로 사용됩니다.

We're able to use the shift method to return and then delete the first value from the arguments array. Note that we've called it from the Array prototype since, strictly speaking, 'arguments' is not a real array and so doesn't inherit the shift method like a regular array would.


You can also call the shift method like this:

[].shift.call(arguments);

The simplest way might be:

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

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

Assuming, that target function is already attached to a "window" object.


If you want to pass with "arguments" a few others, you have to create the array of all arguments together, i.e. like this:

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

Now I'm using this:

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

console: 3


Couldn't you just pass the arguments array along?

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

In case somebody is still looking for dynamic function call with dynamic parameters -

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

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

참고URL : https://stackoverflow.com/questions/676721/calling-dynamic-function-with-dynamic-number-of-parameters

반응형