Задать вопрос
Aleksei_Segodin
@Aleksei_Segodin
арт директор / дизайнер

Как вызвать функцию из тела родительской функции?

...надеюсь я правильно сформулировал вопрос.
Суть вот в чем. Есть такая структура кода:

function myBigFunction() {
        
        func1('func2');
        func1('func3');
        
        function func1(functionName) {
            parent[functionName]; // что написать вместо 'parent', чтобы вызов функции сработал?
        };
        
        function func2() {
            // ...  
        };
        
        function func3() {
            // ...  
        };
        
    }


Если бы функции func2 и func3 были объявлены глобально, я бы мог написать window[functionName] и всё бы работало. Но как обратиться именно к родительской функции?

Расширенный вариант кода для тех у кого есть время:
function myBigFunction() {
        
        loadData('/api/url-a', 'func2', [a, b, c]);
        loadData('/api/url-b', 'func3', [1, 2, 3]);
        
        function loadData(url, handler, params) {

            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function () {
                if (this.readyState === 4 && this.status === 200) {
                    
                    var dat = [this.responseText];
                    parent[handler].apply(null, dat.concat(params)); // что написать вместо 'parent', чтобы вызов функции сработал?
                    
                }
            };
            xhr.open("GET", url, true);
            xhr.send();
        }
        
        function func2(data, a, b, c) {
            // ...  
        };
        
        function func3(data, x, y, z) {
            // ...  
        };
        
    }
  • Вопрос задан
  • 202 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
y0u
@y0u Куратор тега JavaScript
dev
Какой-то странный у вас подход. Вы вызываете myBigFunction, которая вызывает func1, которая в свою очередь вызывает две остальные. Почему бы вам в том месте, где вы пишите
func1('func2');
func1('func3');
не написать
func2();
func3();
?

В крайней случае можно написать вот так:
function myBigFunction() {
	
	var methods = {
		func1: function(functionName) {
			methods[functionName]();
		},
		func2: function() {
			console.log('2');
		},
		func3: function() {
			console.log('3');
		}
	}
	
	methods.func1('func2');
	methods.func1('func3');

}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kttotto
пофиг на чем писать
Если так ставится вопрос, то может Вы не правильно подошли к решению самой задачи?
Ну а если все так критично, то самое простое, что приходит в голову
switch(functionName){
    case 'func2': func2(); break;
    case 'func3': func3(); break;
}

Вынесите только его в отдельный метод.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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