2015-03-23 2 views
-1

У меня есть строка кода, которую я даю, которая уже создана для меня в другом месте, используя Blockly. Она смотрит на меня, как это правильно, когда я эхо его прямо на странице:Eval not declaring functions

function someName(){ 
    //some code 
} 
//more code 
someName(); 

Однако, когда я называю Eval на него, вызов функции сама не работает. Он утверждает, что функция не определена. Все, кроме деклараций функций, работает. Сама строка кода установлена, и я не могу ее изменить, если не выполняю синтаксический анализ. Есть ли более простой способ объявить эти функции, чтобы код мог их называть?

Тестовый случай (который я использовал):

function test(){ 
    alert("This is a test"); 
} 
test(); 
+1

Можете ли вы предоставить простой тестовый пример? Я не могу легко воссоздать вашу проблему. (т. е. 'eval (" function someName() {console.log (1)}; someName(); ")' правильно записывает '1', как я ожидаю) – apsillers

+1

Ваш« тестовый пример »- это только ваш исходный код с другим имя. Я думаю, что @apsillers искал, вы знаете, что-то на самом деле демонстрирует проблему, которую вы видите. –

ответ

1

eval работает в пределах особой среды, которая во многих отношениях много как местного области. Так что, если вы звоните eval на эту строку внутри функции, то функция someName будет объявлена ​​только в пределах этой функции, например:

function doSomething(str) { 
 
    eval(str); 
 
    snippet.log(typeof someName); // "function" 
 
} 
 
doSomething("function someName() { }"); 
 
snippet.log(typeof someName); // "undefined"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Если вы хотите объявлены глобально, то должны сделать некоторую работу. Kangax wrote up an excellent discussion of the options для "global eval". Одним из вариантов является один Дэвид Флэнаган предложил:

var geval = this.execScript || eval; 

Затем используйте geval. Это работает, потому что IE имеет execScript, который работает в глобальной области действия, а в других браузерах, вызывающий evalкосвенно через переменную, ссылаясь на нее, заставляет ее работать и в глобальной области. Но прочитайте статью, чтобы узнать подробности и варианты.

function doSomething(str) { 
 
    var geval = this.execScript || eval; 
 
    geval(str); 
 
    snippet.log(typeof someName); // "function" 
 
} 
 
doSomething("function someName() { }"); 
 
snippet.log(typeof someName); // "function"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

+0

Но у функции op есть вызов функции внутри той же самой строки кода? – Bergi

+0

@ Берги: Да, но это совсем не ясно, что они подразумевают под «не работает». Я предполагаю, что, поскольку 'eval' * does * работают, что они ожидают, что функция будет объявлена ​​в коде вне строки после того, как они ее оценят, и, вероятно, вне функции, в которой они ее также оценили. Я мог бы, конечно, ошибаться. :-) –

+0

А, да, похоже, сейчас работает! Огромное спасибо. Я подумал, что это связано с тем, как работает eval, но я не мог найти достаточную информацию, пытаясь понять разницу. – Emp