【问题标题】:Trouble understanding jQuery.parseJSON JSON.parse fallback无法理解 jQuery.parseJSON JSON.parse 回退
【发布时间】:2011-10-23 05:24:00
【问题描述】:

这是source of $.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()快)

【问题讨论】:

    标签: javascript jquery json parsing


    【解决方案1】:

    new Function() 允许您将函数作为字符串传递。

    在这种情况下,该函数被创建为简单地返回由 json 字符串描述的对象。由于 json 是一个有效的对象字面量,这个函数只返回 json 中定义的对象。立即调用新函数,返回该对象。

    就性能而言,一些快速的谷歌搜索发现声称new Function()eval 快,尽管我自己没有对此进行测试。

    【讨论】:

    • +1:谢谢。所以 eval 和 new Function 都使字符串成为对象,对吗?
    • 是的,我相信两者的整体结果应该是一样的。
    猜你喜欢
    • 2012-05-08
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    相关资源
    最近更新 更多