2017-02-11 6 views
0

У меня есть строка logo.cr.Button и функциикак сделать строку яваскрипта функция вызова

logo.cr.Button = function(){ 
//something 
} 

var strg = 'logo.cr.Button'; 
strg(); 

сейчас как-то я должен сделать эту строку вызова функции

как strg(); но это говорит

strg не является конструктором

здесь

+0

отредактировал мой вопрос немного, пожалуйста, еще раз проверьте –

+0

не работает @thomas говорит, что не функция –

+1

Звучит как [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy -проблемы). Зачем вам это нужно в первую очередь? Предоставьте более подробную информацию о проблеме более высокого уровня, которую вы пытаетесь решить. – charlietfl

ответ

1

В общем, когда мы пишем функцию JavaScript в результате объявление функции выглядит следующим образом:

function demo() { 
    // function stuff here 
} 

Вы вероятно, более чем осознавая, что «в функциях JavaScript являются первоклассными объектами». Это фраза, которая носится повсюду, и не зря. Это очень мощная идея, которая работала над тем, чтобы поднять JavaScript туда, где он есть. Здесь мы не будем вдаваться в подробности первоклассных объектов. Все, о чем мы заботимся, это тот факт, что в JavaScript функции являются объектами. Это означает, что данная функция также может быть объявлена ​​путем вызова его конструктора:

var demo = new Function(); 

Теперь давайте представим, что мы имеем функцию с параметрами и инструкциями:

function demo(name, age) { 
    console.log('my name is ' + name); 
    console.log('my age is ' + age); 
} 

и теперь, чтобы преобразовать его в конструкторе синтаксис :

var demo = new Function(
    "name,age", 
    "console.log('my name is ' + name);" + 
    "console.log('my age is ' + age);" 
); 

Это довольно легко понять, что эти две функции одинаковы, они просто объявлены по-разному. Важное различие состоит в том, что у нас есть легко доступные строки, с которыми мы можем манипулировать.

Это относится к вашей функции очень похожим образом.

var strfunc = new Function ("", "logo.cr.Button()"); 

Я не могу отформатировать это, потому что я нахожусь на мобильном телефоне. Но я буду как можно скорее.

+1

Спасибо, что было очень полезно –

+1

Вы не должны использовать 'eval' или' new Function' таким образом. В общем, это плохая идея, если «новая функция» будет обращаться к переменным, которые находятся за пределами области действия этой функции, потому что это приведет к неожиданному поведению, если вы, например. необходимо использовать транспилярный или мини-скрипт. –

+0

@ t-niese Я понимаю, что eval не используется, но новая функция, которую я использовал с транспилером и с минимальным скриптом без каких-либо проблем. Если вы беспокоитесь о сфере видимости, вы можете просто привязать соответствующий контекст к функции или передать ее в качестве параметра. Я действительно не вижу никаких оснований для заявления «не стоит». Я был бы рад, если бы вы могли более подробно указать, почему вы так думаете? – zfrisch

1

Это не сработает, потому что JavaScript думает, что вы используете точечную нотацию. Когда вы пишете logo.cr.Button() JavaScript ищет функцию Button() в объекте cr, который находится в объекте logo.

Я рекомендую изменять имя на logoCrButton = function()...

1

Вы можете использовать eval, но его не рекомендуется. Вопросы Secury - это только одна причина, потому что пользователь может использовать eval для выполнения другого кода, который не должен выполняться. В пределах this вопрос объясняется полностью.

var logo={cr:{}}; 
 
logo.cr.Button = function(){ 
 
    console.log("something"); 
 
} 
 

 
var string = "logo.cr.Button()"; 
 
eval(string);

Если вы можете избежать Eval затем использовать обычный вызов функции, объект или массив вместо. Для итераций Итерация через массив намного лучше и стабильнее по сравнению с оценкой некоторых параметров динамически, как вы можете видеть here.

Этого второй пример не использует Eval, но тем не менее вы можете вызвать определенную функцию, используя строку:

var obj={logo:{cr:{Button:function(){console.log("something");}}}}; 
 

 
var string = "logo.cr.Button"; 
 

 
function callFunctionByString(string,obj){ 
 
    var parts = string.split('.'); 
 
    parts.forEach(function(part){ 
 
    obj = obj[part]; 
 
    }); 
 
    obj(); 
 
} 
 

 
callFunctionByString(string,obj);

Надеется, что это помогает.

+0

Если это не хорошая практика, почему я бы это использовал –

+0

Надеюсь, мой второй пример также подходит для вашего вопроса. – Blauharley

1

Использование eval ("logo.cr.Button")();

Это будет выполнять функции, конечно, если у вас есть объект, как:

var logo = { 
    cr: { 

    } 
}; 

 Смежные вопросы

  • Нет связанных вопросов^_^