Проблемы с пониманием jQuery.parseJSON JSON.parse откат - PullRequest
5 голосов
/ 09 августа 2011

Это источник $.parseJSON

function (data) {
    if (typeof data !== "string" || !data) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim(data);

    // Attempt to parse using the native JSON parser first
    if (window.JSON && window.JSON.parse) {
        return window.JSON.parse(data);
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if (rvalidchars.test(data.replace(rvalidescape, "@").replace(rvalidtokens, "]").replace(rvalidbraces, ""))) {

        return (new Function("return " + data))();

    }
    jQuery.error("Invalid JSON: " + data);
}

У меня проблемы с пониманием следующих откатов

return (new Function("return " + data))();

, а также (этого нет вjQuery)

return (eval('('+ data + ')')

Я хотел бы знать эти вещи

  1. Как на самом деле работает этот запасной синтаксический анализ?
  2. Почему eval не используется в резервном?(Разве это не быстрее, чем new Function())

1 Ответ

4 голосов
/ 09 августа 2011

new Function() позволяет передавать вашу функцию в виде строки.

В этом случае функция создается для простого возврата объекта, описанного строкой json. Поскольку json является допустимым литералом объекта, эта функция просто возвращает объект, определенный в json. Новая функция вызывается немедленно, возвращая этот объект.

Что касается производительности, некоторые из них быстро нашли, что new Function() быстрее, чем eval, хотя я сам не проверял это.

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