【问题标题】:Why does Crockford use this format for writing JSON.parse function?为什么 Crockford 使用这种格式来编写 JSON.parse 函数?
【发布时间】:2015-10-16 01:43:27
【问题描述】:

在这个 JSON.parse 函数中: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js

为什么crockford会选择在他的变量声明中声明这么多函数,然后分开1个函数,最后返回一个main函数?

编写这样的函数有什么好处:

伪语法:

var json_parse = (function () {
    var x,
        y, 
        z, 
        string = function () {
             <code>
        },
        word = function () {
             <code>
        },
        white = function () {
             <code>
        },
        value;

    value = function () {
        <code>
        white();
        string();
        etc..
    };
    return function (string) {
         return something;
    }
})();

vs 写这样的函数:

var parse_json = function (input) {
     var x, y, z;

     function string () {
           <code>
     }
     function word () {
           <code>
     }
     function white () {
           <code>
     }
     function value () {
         <code>
          white();
          string();
          etc..
     }

    function mainParse () {
         return something;
    }

   return mainParse(input);

};

希望我的小代码示例有意义。我是 JavaScript 新手,我想确保自己学习最佳实践或编写类似这样的大型函数。

【问题讨论】:

  • 第二种情况,每次运行parse_json时都会创建一堆函数@
  • 实际上,在第二种情况下,您拥有它的方式将不起作用,因为您返回的是函数而不是函数的调用...如果您返回了一个函数,那么将不会创建更多函数使用时比使用 doug 的语法...
  • @dandavis 在克罗克福德的例子中,外部函数被立即调用,而 OP 的不是,所以它们确实返回相同的东西——有点——但就像阿马丹说的那样,克罗克福德只创建闭包内的函数一次。
  • @Semicolon:啊,好眼力。我的主要观点是,不是 OP 询问的“var ,,,”东西导致了区别,其他 cmets+answer 让我不清楚。

标签: javascript json function syntax


【解决方案1】:

每次调用json_parse 时,您的变体都必须创建wordwhite...函数。他的方式让他可以创建它们一次并在闭包中捕获它们,这样他就可以访问它们,但他的功能之外的任何其他人都不能访问它们。

【讨论】:

  • 好的,谢谢,我想我明白了。那是因为他在最后返回函数并且可以存储内部定义的函数?
  • 之所以有效,是因为 IIFE 创建了一个新范围。 (function() { ... return function() {...} })()function() { ... } 相同,但它为您提供了第一个 ...。 :)
  • @jmancherje 如果您还想知道为什么他分配了大部分功能但有一个作为声明,我怀疑这是为了仔细控制 IIFE 中悬挂和不悬挂的内容范围。最后,我不确定没有其余代码。它允许代码更加“严格”,因为函数声明提升了它们的实际值,而变量声明只提升了声明 var 的事实,而不是它最终绑定到的值。
猜你喜欢
  • 2015-11-06
  • 2016-01-15
  • 2020-03-18
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多