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 выполняет строку. Зачем эвалить скомпилированную функцию, если ее и так можно вызвать?


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