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();
Оригинал записи http://blog.axshavan.cz/2021/03/govno-kakoeto.html