동적 개수의 매개 변수를 사용하여 동적 함수 호출
이 질문에는 이미 답변이 있습니다.
나는 이것에 대한 트릭을 찾고 있습니다. 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
사용할 수있을 것 같습니다 .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);
}
첫 번째 인수는 함수 이름으로 사용되며 나머지 모든 인수는 호출 된 함수에 대한 인수로 사용됩니다.
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);
}
'IT story' 카테고리의 다른 글
키워드 세트는 실제로 VBA에서 무엇을합니까? (0) | 2020.06.14 |
---|---|
"벡터화"란 무엇입니까? (0) | 2020.06.14 |
.gitignore에 존재하지 않는 추적되지 않은 파일을 어떻게 표시합니까? (0) | 2020.06.14 |
분리 된 mosh 세션에 어떻게 다시 연결합니까? (0) | 2020.06.14 |
.NET을 사용하여 파일을 잠그는 프로세스를 어떻게 알 수 있습니까? (0) | 2020.06.14 |