среда, 3 марта 2021 г.

Заметка про джаваскрипт

Больше часа потратил всяким гугленгием и экспериментами, и в итоге всё равно пришлось придумывать обходной маршрут. Проблема такая. Есть некий кусок джаваскрипта...
function () {
    ...
    function azaza515(obj) {
        ...
    }
    
    function azaza520(obj) {
        ...
    }
    
    function init(parameter) {
    	...
        var a = 'azaza' + parameter; // короче, как-то динамически собирается строка с именем функции
        // которую надо как-то вызвать из области видимости уровнем выше, но не глобальной
        
        var f = new Function(a + "()"); // не работает, потому что ищет в глобальной области видимости
        window[a](); // не работает по той же причине
        ...
        
        azaza520(); // естественно, работает. А чего б не работать-то
    }
}
Так и не смог такую штуку сделать. Вариант switch (parameter) { case ... } как-то уж очень сильно пахнет карри - там, может, десятки этих azaza-функций будут. В итоге сделал их свойствами объекта:
function () {
    ...
    
    var jopa = { 
        azaza515: function(obj) {
            ...
        },
        azaza520: function(obj) {
            ...
        }
    }
    
    function init(parameter) {
    	...
        var a = 'azaza' + parameter;
        ...
        if(jopa.hasOwnProperty(a)) jopa[a](); // так работает
    }
}
А в итоге-то, можно вызвать в джаваскрипте функцию из внешней области видимости, но не глобальной, если её имя хранится в строке?
UPD: Вариант во всеми так ненавидимом и презираемом PHP безо всякого eval():
function a() {
    function foo() {
        echo "foo\n";
    }
    function init() {
        $f = "foo";
        $f(); // несколько попроще конструкция, не правда ли?
    }
    init();
}
a();

Комментариев нет:

Отправка комментария

Ублюдочный Гугл поломал форму комментариев. Извините.