2013-08-17 3 views
1

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

Calling a JavaScript function named in a variable

Но это не ответ на мой вопрос.

Это нормально работает:

window['class']['sub_class']['function_name'](data); 

Но теперь я пытаюсь сделать общую функцию, которая может справиться с любой глубины:

function callbackFunction(callback, data){ 
    //callback = a.b.c, or a.b, or a 
    callback = explode(callback);  

    //I need to be able to call callbackFunction and somehow callback and form their proper form below 
    window[callback.a](data); 
    //or 
    window[callback.a][callback.b](data); 
    //or 
    window[callback.a][callback.b][callback.c](data); 
} 
+0

Вы имеете в виду 'callback' - это строка? – bfavaretto

+0

Да, обратный вызов - это строка. Однако взрывать его, чтобы найти какое-то решение. – lewicki

+0

Несомненно, но почему бы не просто передать фактическую функцию? Он может быть привязан к правильному объекту с помощью 'bind'. – bfavaretto

ответ

1

Я считаю, что дубликат, предложенным Берги будет решать только половину вашей проблемы. Поскольку ваше окончательное значение будет функцией, и поскольку эта функция является членом объекта, вы в конечном итоге выполняете ее в неправильном контексте (то есть с неправильным значением this).

Я предлагаю вам использовать что-то вроде этого:

http://jsfiddle.net/7CEd5/

Сравните значение this в обратный вызов с тем, что вы получите, используя ответы на Convert string in dot notation to get the object reference.

0

Вы можете цепи ссылки на объекты/вложенные объекты/и т. д., как долго вы хотите. Если у вас строка с разделителями точек (например, "document.blah.blah2.method"), вам необходимо разбить ее на отдельные токены (например, ["document", "blah", "blah2", "method"]).

Тогда это просто вопрос пробегает по цепочке:

var c = window; 
for (var i = 0; i < chain.length - 1; i++) { 
    c = c[chain[i]]; 
} 
c[chain[chain.length-1]](some_arguments); 
+0

Это создает копию окна. Этого не может быть. – lewicki

+2

Это создает _reference_ для окна. Вы не копируете объекты, переназначая их ссылки. –

+0

Если я делаю: 'window.a.b = 1; var c = window; cab = 3; console.log (window.ab) // печатает 1' – lewicki

Смежные вопросы