Как да конвертирам динамичен Javascript в текст?

Имам някакъв код (каквото и да е в тялото на функцията jsToBeConverted по-долу), който искам да мога да го конвертирам в текст, така че потребителят да може да го копира и след това да го постави в елемент <script> на техния сайт, за да бъде изпълнен.

someElement.onclick = function ()
{
    var textForUserToCopy = (function ()
    {
      x = document.getElementById('someInput').value;

      var jsToBeConverted = function ()
      {
        var y = x + 6;

        var z = function (a)
        {
          return (a + 5);
        };

         window.d = z(y);
      };

      var jsToExecute = "(" + jsToBeConverted + ")();"

      return jsToExecute;
    })();
};

Това обаче ще генерира следния текст:

"(function ()
 { 
   var y = x + 6; 

   var z = function (a)
   {
     return (a + 5);
   };

   window.d = z(y);
 })();"

Но това не е това, което искам. Ако горното се оцени, x очевидно ще бъде недефиниран. Това, което искам, е x да бъде заменен от стойността си в момента и след това js да се преобразува в текст. Така че, ако стойността на x е била 123, ето как трябва да изглежда генерираният текст:

"(function ()
 {
   var y = 6 + 6; 

   var z = function (a)
   {
     return (a + 5);
   };

   window.d = z(y);
 })();"

Ако горният низ бъде оценен - ​​window.d ще бъде 17

Има ли някаква стандартна функция/процес за генериране/конвертиране на динамичен код в текст?

Благодаря ти


person The Random Guy    schedule 09.02.2014    source източник
comment
Защо искате да направите това? Това изглежда като учебникарски пример за XY проблема.   -  person tckmn    schedule 09.02.2014
comment
Създавам приложение, което приема малко потребителски вход и въз основа на това генерира някакъв код, който потребителят да постави в <script>.   -  person The Random Guy    schedule 09.02.2014
comment
Винаги ли x ще бъде число или може да бъде от различен тип? Ако е така, какви видове може да бъде?   -  person tckmn    schedule 09.02.2014
comment
В този случай може да бъде само число - но това е само пример. Действителният код за конвертиране може да е 10 пъти по-дълъг и броят на динамичните стойности може да бъде еднакво голям, както и техните типове.   -  person The Random Guy    schedule 10.02.2014
comment
Е, JS няма общ uneval или проверка, така че ще трябва ръчно да обработвате всеки тип... (вижте отговора)   -  person tckmn    schedule 10.02.2014
comment
Ако наистина искате да направите това, трябва да генерирате AST от кода, да създадете някаква логика за търсене на x в средата и да го замените по подходящ начин. Разгледайте esprima.org и github.com/benjamn/recast.   -  person Felix Kling    schedule 10.02.2014


Отговори (1)


Можете просто да свържете.

e.g.:

"function (x) { return " + generated_value + " + x }";

За по-елегантно изглеждащо решение вижте форматиране на низове: JavaScript еквивалентен на printf/string.format

person Brandon Duffany    schedule 09.02.2014
comment
благодаря, ще разгледам sprintf - този стандартен Js поддържа ли се от всички браузъри?? - person The Random Guy; 10.02.2014
comment
Не мисля така. Може да се наложи да напишете функцията сами или да използвате вече внедрено решение. Особено ми харесва този: stackoverflow.com/a/4974284/828709 - person Brandon Duffany; 10.02.2014