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

Вы можете использовать javascript для отключения кнопки «Назад» (обычно путем отправки пользователя на страницу, которая пересылается на другую страницу, так что щелчок назад снова отправляет вам вперед). Постоянный пользователь все еще может вернуться на 2 этапа назад и перешагнуть через цикл.

Эта страница находится в кеше браузера. Вы можете попросить браузер не кэшировать что-либо, но это может испортить производительность, а иногда и резко, поэтому я бы не рекомендовал ее.

147
задан Cœur 18 March 2017 в 08:06
поделиться

5 ответов

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

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");
184
ответ дан 23 November 2019 в 22:26
поделиться

Ваш код только работает на глобальные функции, т.е. членов 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"
21
ответ дан 23 November 2019 в 22:26
поделиться

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

Необходимо указать a 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);
}
15
ответ дан 23 November 2019 в 22:26
поделиться

Вот то, в чем Вы нуждаетесь:

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

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

Мы можем использовать shift метод, чтобы возвратиться и затем удалить первое значение из массива arguments. Обратите внимание, что мы назвали его от прототипа Массива с тех пор, строго говоря, 'аргументы' не действительный массив и так не наследовался shift метод как эквидистантная антенная решетка был бы.


Можно также назвать метод сдвига как это:

[].shift.call(arguments);
12
ответ дан 23 November 2019 в 22:26
поделиться

Не могли Вы просто передать 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');
-4
ответ дан 23 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: