Способы вызова функции Javascript с использованием значения строковой переменной?

Я видел эту технику для вызова функции Javascript на основе значения строковой переменной.

function foo() {
    alert('foo');
}

var test = 'foo';

window[test]();  //This calls foo()

Это приемлемый способ сделать это или есть лучший способ? Любые проблемы с перекрестным браузером, о которых нужно беспокоиться?

Ответ 1

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

function runFunction(name, arguments)
{
    var fn = window[name];
    if(typeof fn !== 'function')
        return;

    fn.apply(window, arguments);
}

//If you have following function

function foo(msg)
{
    alert(msg);
}

//You can call it like

runFunction('foo', ['test']); //alerts test.

Ответ 2

Я лично не стал бы беспокоиться даже со вспомогательной функцией

  window[someKey]('test')

будет хорошо.

Однако я бы вообще не поддерживал набор возможных функций для вызова в глобальном масштабе. Следовательно, я бы использовал более общий шаблон: -

 obj[someKey]('test')

где obj может быть this, свойством этого или переменной из замыкания.

Ответ 3

Вы можете использовать eval (str)

eval('foo();');

используйте это с особой осторожностью.

Ответ 4

Вы можете просто использовать его как это... (конечно, замените строки с необходимыми переменными)

document["getElementById"]("elementName")["style"]["border"] = "1PX SOLID GREEN";

Который также легко/обычно типизируется, как это, конечно...

document.getElementById("elementName").style.border = "1PX SOLID GREEN";

Вот еще один многомерный пример...

var myObject = new Object();
myObject["myValue"]["one"] = "first value";
myObject["myValue"]["two"] = "second value";
alert(myObject["myValue"]["two"]); //outputs "second value"

который также может быть записан как...

var myObject = new Object();
myObject["myValue"] = {one: "first value", two: "second value"};
alert(myObject["myValue"]["two"]); //outputs "second value"

Ответ 5

Я создал функцию для вызова именованной функции. Он работает как в браузере, так и в Node.js. Я создал gist (https://gist.github.com/netsi1964/3f19bd96f2d6e18bd818), который также содержит небольшой тест. Отпечаток функции: callFunction(scope, fn, args). Он устанавливает область действия в указанную область и по умолчанию имеет значение window (в браузере) и global (в Node.js). Чтобы ответить на ваш первоначальный запрос, вы будете использовать его следующим образом: callFunction(window, "foo",["test"])