Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   часть имени функции в переменной (https://javascript.ru/forum/misc/51823-chast-imeni-funkcii-v-peremennojj.html)

ild 20.11.2014 23:38

часть имени функции в переменной
 
Добрый вечер.
Есть функция xxx_myfunc(){}.
Так вот xxx постоянно меняется. Зато его есть в глобальной переменной name.
Не могу сообразить, как вызвать эту функцию?
Типа:
name+'_myfunc'();

krutoy 20.11.2014 23:49

eval(name+"_myfunc()")
foo_func=function(){alert("foo")}
bar_func=function(){alert("bar")}

name="foo"
eval(name+"_func()")
name="bar"
eval(name+"_func()")

Это чтоли надо?
без eval:
foo_func=function(){alert("foo")}
bar_func=function(){alert("bar")}
  
name="foo"
call_func=function(){
   window[name+"_func"]()
}
call_func()
name="bar"
call_func()
//  foo
//  bar

bes 20.11.2014 23:51

Цитата:

Сообщение от ild
Не могу сообразить, как вызвать эту функцию?

не очень хорошая затея

var n = 1;
function some_myfunc() {
	alert("good job " + n);
	n++;
}
var name = "some";
var funcName = name + "_myfunc";
window[funcName]();
eval(funcName)();

ild 21.11.2014 00:03

спасибо всем

krutoy 21.11.2014 00:37

bes,
Я не совсем понял смысл Вашего примера (кстати, в ноде Ваш код не работает, работает, если использовать FE -- это к слову), ведь ТС сказал, что xxx-часть ф-ции меняется, а у вас
some_myfunc=function () {
    alert("some");
}
another_myfunc=function(){
    alert("another")
}
var name = "some";
funcName = name + "_myfunc";
window[funcName]();
eval(funcName)()
name="another"
window[funcName]();
eval(funcName)()

//  some
//  some
//  some
//  some

И особенно непонятно:
eval(funcName)()
Это то же самое, что
funcName()
Зачем там eval нужен?

krutoy 21.11.2014 00:54

ild,
Если Вы хотите без eval, я добавил вариант в первый ответ, на всякий случай.

ruslan_mart 21.11.2014 10:02

ild, eval не стоит использовать. Либо через window, либо все ф-ции засунуть в объект и обращаться к ним таким образом:

var obj = {
    test: function() {
        alert(1);
    },
    foo: function() {
        alert(2);
    }
};


var name = 'test';
obj[name]();

var name2 = 'foo';
obj[name2]();

bes 21.11.2014 17:51

Цитата:

Сообщение от krutoy
кстати, в ноде Ваш код не работает, работает, если использовать FE -- это к слову

поясни о чём ты

Цитата:

Сообщение от krutoy
bes,
Я не совсем понял смысл Вашего примера (...), ведь ТС сказал, что xxx-часть ф-ции меняется, а у вас

там показано два способа вызова для одной функции с учётом наличия xxx-части, сколько функций далее создавать по этому принципу непринципиально


а если так?
some_myfunc=function () {
    console.log("some");
}
another_myfunc=function(){
    console.log("another")
}
var name = "some";
funcName = name + "_myfunc";
window[funcName]();
eval(funcName)()

name="another" 
funcName = name + "_myfunc";
window[funcName]();
eval(funcName)()

//  some
//  some
//  another
//  another



Цитата:

Сообщение от krutoy
И особенно непонятно:
eval(funcName)()
Это то же самое, что
funcName()
Зачем там eval нужен?

а сам тогда зачем написал? наверное потому, что не получилось строку как функцию вызывать

в общем, Ruslan_xDD, показал как рекомендуется делать

bes 21.11.2014 17:55

Цитата:

Сообщение от krutoy (Сообщение 342071)
eval(name+"_myfunc()")
без eval:
foo_func=function(){alert("foo")}
bar_func=function(){alert("bar")}
  
name="foo"
call_func=function(){
   window[name+"_func"]()
}
call_func()
name="bar"
call_func()
//  foo
//  bar

упс
(function () {
var foo_func=function(){alert("foo")}
var bar_func=function(){alert("bar")}
  
name="foo"
call_func=function(){
   window[name+"_func"]()
}
call_func()
name="bar"
call_func()
//  foo
//  bar
})();

krutoy 21.11.2014 19:14

Цитата:

Сообщение от bes
а если так?

Что это? Вы просто дублируете код. В вашем случае можно сразу эти функции обычным образом создавать. В вашем случае эти сборки не имеют никакого смысла.
Цитата:

Сообщение от bes
а сам тогда зачем написал?

Что написал? В моем случае eval выполняет строку. Зачем эвалить скомпилированную функцию, если ее и так можно вызвать?

krutoy 21.11.2014 19:19

Цитата:

Сообщение от bes
упс

Это конкурс на лучший бредокод? Объекта window[name+"_func"] не существует в этом случае. Что сказать то хотел? или что-то непонятно в вопросах лексической области видимости переменных? Спросить стесняешься?

Dim@ 21.11.2014 19:52

krutoy, про "упс" бес написал, что без засорения window, твой способ не сработает

bes 21.11.2014 19:55

Цитата:

Сообщение от krutoy
Что это? Вы просто дублируете код.

нет, там отличие в одной строчке

Цитата:

Сообщение от krutoy
В вашем случае можно сразу эти функции обычным образом создавать. В вашем случае эти сборки не имеют никакого смысла.

Цитата:

Сообщение от krutoy
Что написал? В моем случае eval выполняет строку. Зачем эвалить скомпилированную функцию, если ее и так можно вызвать?

смысл там только в том как вызвать функцию, имея на руках только строку её имени, именно этого не хватало ТС, чтобы решить свою задачу самостоятельно
если ты ждал большего, то твои ожидания не оправдались, мир жесток, а жизнь - го-но

Цитата:

Сообщение от krutoy
Это конкурс на лучший бредокод? Объекта window[name+"_func"] не существует в этом случае. Что сказать то хотел? или что-то непонятно в вопросах лексической области видимости переменных? Спросить стесняешься?

к тому, что не нужно плодить глобальных переменных, а также к тому, что window-способ ограничен в применении

krutoy 21.11.2014 21:15

Цитата:

Сообщение от bes
что не нужно плодить глобальных переменных

Ну так замени window на любой объект. Что за детсад. Мне надоело, прекращаю диалог.

bes 21.11.2014 21:25

Цитата:

Сообщение от krutoy
Ну так замени window на любой объект. Что за детсад. Мне надоело, прекращаю диалог.

замени голову на ж-пу, что получится, всё правильно, мозг рано или поздно вытечет :D

kostyanet 23.11.2014 12:47

Цитата:

Сообщение от ild
Не могу сообразить, как вызвать эту функцию?
Типа:
name+'_myfunc'();

Глобально так не делают. Делают локальный namespace и через него все получают. Выше уже было. Суете в объект с именем - получаете тот самый namespace и вперде[prefix+'_func'](){}.

Типовой пример

if(typeof _validate[input.type]!=='undefined')
		_validate[input.type]();
	else
		_validate.text();


Часовой пояс GMT +3, время: 03:27.