【问题标题】:Alternate ways of creating javascript functions创建 javascript 函数的替代方法
【发布时间】:2012-10-18 02:39:38
【问题描述】:

我遇到了以下脚本,但不明白第一行。它显然要么返回 JSON.stringify 要么返回匿名函数。最好这样做,还是使用传统的function printObj(obj)?另外,JSON 是在哪里定义的?谢谢

var printObj = typeof JSON != "undefined" ? JSON.stringify : function(obj) {
  var arr = [];
  $.each(obj, function(key, val) {
    var next = key + ": ";
    next += $.isPlainObject(val) ? printObj(val) : val;
    arr.push( next );
  });
  return "{ " +  arr.join(", ") + " }";
};

$("#log").append( printObj(object1) );

【问题讨论】:

  • 所有很棒的答案。大卫对我的印象最深,但可能是因为我先阅读了其他人。谢谢
  • 另外,为什么我的原始问题要降价。如果有我不应该做的事情,请告诉我。谢谢
  • 可能是因为您的标题确实模棱两可和/或您的实际要求是错误的。只是有点不清楚。 (我没有投反对票)
  • 谢谢Layke,我很难想出标题,但下次会尽量小心。

标签: javascript


【解决方案1】:
var printObj = // setting the variable printObj
               typeof JSON != 'undefined' // if this is true then set printObj to
                    ? JSON.stringify // <- ...this function
               : function( obj ) {
                   // otherwise let's build it ourselves...
               };

typeof JSON != 'undefined' 将返回 true 或 false,无论标识符 JSON 是否已定义。如果 x 尚未定义,typeof x 不会导致引用错误。

【讨论】:

    【解决方案2】:

    JSON 已经是一个存在于 javascript 中的函数。 (它有你最有可能使用的stringify 和parse)

    第一行,只是确保 stringify 存在一个函数,如果不存在,则将对象传递给一个函数函数,该函数尝试解析 JSON 对象并将其作为 JSON 字符串返回。

    (我相信您正在使用的函数“hack”是为了修复IE8 compatibility issue,其中 IE8 没有 JSON 对象。您可以完全避免使用它,如果您在页面中设置:

    &lt;meta http-equiv="X-UA-Compatible" content="IE=8" /&gt;

    此外,第一行赋值的结构使用了名为ternary operator assignment 的东西。

    例如:

    var t = 1 == 1 ? 1 : 0;
    

    【讨论】:

      【解决方案3】:

      JSON 是一些 Web 浏览器(如 FireFox 和 Chrome)自动定义的变量。老版本的IE没有定义JSON,很多烦人的用户还是有这些版本的,所以在这种情况下是手动定义的。

      我认为最好的解决方案是添加对 json 库的引用。可以在这里找到:http://www.json.org/js.html

      【讨论】:

        【解决方案4】:

        它定义了一个可以一直使用的printObj函数:

        • 如果定义了 JSON.stringify,printObj 就是这个函数
        • 如果 JSON.stringify 不可用,则使用新函数

        注意

        【讨论】:

          【解决方案5】:

          “我遇到了下面的脚本,第一行看不懂。显然它要么返回 JSON.stringify 要么返回一个匿名函数。”

          看来你确实理解了第一行。

          “这样最好还是使用传统的function printObj(obj)?”

          简单地定义函数会产生不同的结果,因为原生 JSON.stringify 将被忽略,并且应该优先于 shim。

          问题中给出的替代方案不是一个完整的垫片,即使是,本机肯定会表现得更好。

          “另外,JSON 是在哪里定义的?”

          默认在 ECMAScript 5 环境中定义。

          【讨论】:

            【解决方案6】:

            使用这种语法,您可以在创建函数的同时检查是否存在合适的内置方法。 JSON 是一些现代浏览器内置到引擎中的对象,很像 Window 或 Location。较旧的浏览器没有 JSON,因此会返回 undefined,并允许使用自定义匿名函数。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-09-24
              • 2021-11-09
              • 1970-01-01
              • 1970-01-01
              • 2022-01-25
              • 1970-01-01
              • 2015-03-17
              • 2021-08-04
              相关资源
              最近更新 更多