передача JSON с функциями через AJAX - PullRequest
0 голосов
/ 29 сентября 2018

Проще говоря, я бы хотел "повторно гидрировать" функции, которые передаются из AJAX, следующим образом:

//AJAX response:
{"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"}

И, очевидно, baz должна быть функцией, а не строкой.Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Это возможно, но, конечно, мы должны использовать зло eval .. использовать на свой страх и риск !!

var ajaxResponse = {"foo":"bar","baz":"function(){console.log('I am back working as a function!')}", "lambda": "() => console.log('Hello i\\'m a lambda')"};

function isAFunction(v) {
    try {
        eval("var f = " + v);
        return typeof f === "function";
    } catch (e) {
        return false;
    }
}

var result = Object.entries(ajaxResponse).reduce((obj, [key,value]) => {
      if (isAFunction(value)) {
          eval("obj[key] = " + value);
      } else {
            obj[key] = value;
      }
      return obj;
      
}, {});

result.baz();
result.lambda();
0 голосов
/ 29 сентября 2018

Как уже предложил Юзеф, вы можете использовать eval().

Но, пройдя через Google, вы увидите, что использование этой функции НЕ рекомендуется:

  1. https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
  2. Когда используется JavaScripteval () не зло?
  3. https://javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval/
  4. Почему использование функции eval в JavaScript - плохая идея?

Как предлагает этот блог (http://2ality.com/2014/01/eval.html) Я бы порекомендовал вам использовать это:

let json = {"foo":"bar","baz":"function(){console.log('I am back working as a function!');}"};

let func = new Function("console.log('I am back working as a function!');");
func();

Если у вас нет возможности изменить свой JSON, вы можете просто использовать str.replace().


Имейте в виду, что произвольный код может быть выполнен!Я бы настоятельно рекомендовал бы вам сделать, например, что-н.как это вместо того, чтобы просто отвечать с помощью функции.Делая следующее, вы могли бы создать своего рода белый список.Таким образом, независимо от того, был ли обработан http-ответ, злоумышленник может выполнять только предварительно определенные функции javascript.

function func1() {
  console.log('I am back working as a function!');
}

function func2() {
  console.log('another code block');
}

let json = {"foo":"bar","baz":"1"};

switch(json.baz) {
  case "1": func1();break;
  case "2": func2();break;
  default: console.error("Invalid response");
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...