2013-08-05 4 views
-2

Есть ли 'код/​​функция/АЛГОРИТМ' преобразовать строку яваскрипта ?:Выполнение JavaScript кода из строки

var alert = "alert('Hello World!')"; 

В JavaScript синтаксиса; в этом случае на экране отобразится Hello World!.

+4

Вы имеете в виду 'eval'? Не используйте его, это ** зло **. – Halcyon

+1

Для чего вам это нужно? (возможно, есть лучшее решение, чем ['eval'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval)) – Bergi

+0

Вот [почему вы не должны использовать' eval() '] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#Don.27t_use_eval.21). Вероятно, вы захотите [вместо этого использовать функцию первого класса] (https: //developer.mozilla.орг/EN-US/Docs/Web/JavaScript/Справка/Global_Objects/Eval # Use_functions_instead_of_evaluating_snippets_of_code). –

ответ

0

да, есть:

var alert = "alert('Hello World!')"; 

eval(alert); 

Оценивает JavaScript код, представленный в виде строки.

Here is the explanation and other uses of the eval() function.

Это может привести к некоторым непредвиденным проблемам, так как вы выполняете некоторую произвольную строку в качестве яваскрипта кода. Если вы объяснили, почему вам нужно делать то, что вы делаете, возможно, есть более безопасная альтернатива.

+0

Ради тех, кто наткнулся на этот ответ, следует отметить, что переводчик, специфичный для вашего прецедента, почти всегда превосходит маршрут. – matt3141

+0

Спасибо, огромное спасибо –

0

Вы можете использовать eval, но это очень обескуражено!

var alert = "alert('This is evil');" 
eval(alert); 
0

Вы ищете eval. Вы хотите быть осторожным, это может создать определенные риски для безопасности.

Вы можете прочитать эту eval() isn’t evil, just misunderstood

var alert = "alert('Hello World!')"; 
eval(alert); 

An лучший метод может быть что-то вроде этого:

<script src="pretendToBeJavascript.php"></script> 

// pretendToBeJavascript.php contents: 
header('Content-type: text/javascript'); 
echo "alert('Hello World!')"; 
+2

К ниверутору всех ответов, почему? Все ответы верны. Может быть, не рекомендуется, но большинство из них это замечает. – Martijn

2

Вы можете рассмотреть вопрос о создании синтаксического анализа, специфичные для вашего использования. Это ограничит мощность eval исключительно вашим предполагаемым поведением, например, следующие ограничения кода для выполнения глобальной функции.

var parse_vals = function(expr) { 
    if(expr.match(/^['"][^'"]+['"]$/)) { 
     // parse a string literal 
     return expr.substr(1, expr.length - 2); 
    } else if(!isNaN(parseInt(expr))) { 
     // parse a number 
     return parseInt(expr); 
    } else { 
     // fail in parsing literal 
     return null; 
    } 
}; 
var alert_str = "alert('Hello World!')", 
    comps = alert_str.match(/^([^(]+)\(([^)]+)\)$/); 
    // => ["alert(...)", "alert", "'Hello World!'"] 
if(comps) { 
    // apply a global function to the provided arguments, parsed. 
    // all values thus need to be literals, no variable access. 
    window[comps[1]].apply(window, comps[2].split(/,\s?/).map(parse_vals)); 
} else { 
    alert("Invalid code provided."); 
} 

Как уже говорилось, eval небезопасен и следует использовать с осторожностью, если используется. Следовательно, парсер, специфичный для использования, является гораздо лучшим решением. Что еще более важно, сила полноправного оценщика ребенка - , идущая, чтобы быть излишним, несмотря ни на что. Компоненты выражения, которые будут меняться, могут быть выделены и обработаны. Если вся строка является переменной, вы разрешаете произвольную программу, и поэтому ее можно включить как независимый скрипт, например, <script src="data:...">.

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