Вызов функции JavaScript с использованием строки объекта в точечной нотации - PullRequest
9 голосов
/ 11 июля 2011

Предположим, у меня есть строка:

var string = "function";

С

window[string];

Я могу вызвать функцию с именем "function".

Но, когдаУ меня есть:

var string2 = "function.method.weHaveTogoDeeper";

это должно вызвать

window["function"]["method"]["weHaveTogoDeeper"]

Я не могу сделать:

window[string2]

в этом случае.Я не знаю количество "."в строке, так что мне нужна какая-то рутина.

Ответы [ 3 ]

9 голосов
/ 11 июля 2011

Вы можете разбить строку на ., используя метод String.split:

var string2 = "function.method.weHaveTogoDeeper";
var methods = string2.split(".");

В этих примерах methods будет массивом ["function","method","weHaveTogoDeeper"]. Теперь вы сможете выполнить простую итерацию по этому массиву, вызывая каждую функцию по результату предыдущего.

Редактировать

Итерация, которую я имел в виду, была примерно такой:

var result = window;
for(var i in methods) {
    result = result[methods[i]];
}

В вашем примере result теперь должен содержать тот же вывод, что и

window["function"]["method"]["weHaveTogoDeeper"]
6 голосов
/ 11 июля 2011
function index(x,i) {return x[i]}
string2.split('.').reduce(index, window);

edit: Конечно, если вы вызываете функции из строк их имен, вы, вероятно, делаете что-то нехорошее, что вызывает недовольство, особенно в настройках совместного кодирования.Единственный вариант использования, о котором я могу подумать, это то, что вменяемый - это написание среды тестирования, хотя, возможно, есть еще несколько вариантов.Поэтому, пожалуйста, будьте осторожны, следуя этому ответу;вместо этого следует использовать массивы или в идеале прямые ссылки.

1 голос
/ 11 июля 2011

Некоторое время назад я написал:

function RecursiveMapper(handlerName, stack) {
    // check if empty string
    if(!handlerName || handlerName === '' || (handlerName.replace(/\s/g,'') === '')) return null;

    var buf = handlerName.split('.');
    stack = stack || window;
    return (buf.length === 1) ? stack[buf[0]] : this.RecursiveMapper(buf.slice(1).join('.'), stack[buf[0]]);
}

Назовите это так: RecursiveMapper(window[string2]);

Этот также проверяет, определена ли функция сначала в window scope и возвращаетнайден глобальный фай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...