Вызов динамической функции с динамическими параметрами в Javascript [дубликат]
этот вопрос уже есть ответ здесь:
Передача массива в качестве параметра функции в JavaScript
9 ответов
передача аргументов вперед к другой функции javascript [дубликат]
3 ответы
Я ищу подвох в этом. Я знаю, как вызвать динамическую, произвольную функцию в 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');
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