2015-10-16 46 views
4

在此JSON.parse功能: https://github.com/douglascrockford/JSON-js/blob/master/json_parse.js爲什麼Crockford使用這種格式來編寫JSON.parse函數?

爲什麼克羅克福德選擇在他的變量聲明來聲明如此多的功能,然後分開1個功能,然後在年底返回一個主要功能?

是否有利於寫一個函數是這樣的:

僞語法:

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新手,想確保學習最佳實踐或編寫像這樣的大型函數。

+2

在第二種情況下,實際上每次運行'parse_json' – zerkms

+0

時都會創建一堆函數,因此您在第二種情況下擁有它的方式將不起作用,因爲您返回函數的調用而不是函數。 。如果你返回一個函數,比使用doug的語法不會創建更多的函數... – dandavis

+1

@dandavis在crockford的例子中,外部函數立即被調用,而OP的不是,所以他們返回相同的東西 - 有點 - 但像Amadan說的那樣,Crockford只在封閉內部創建函數一次。 – Semicolon

回答

7

您的變體將不得不創建wordwhite ...函數每次調用json_parse。他的方式可以讓他創造一次,然後將它們封閉起來,這樣他們就可以接近他,但不能接觸到他職能以外的任何人。

+0

好的,謝謝,我想我明白了。這是有效的,因爲他最終返回的功能,並可以存儲內部定義的功能? – jmancherje

+2

它的工作原理是IIFE創建一個新的範圍。 '(function(){... return function(){...}})()'和'function(){...}'是一樣的,但是它會給你第一個'...'玩。 :) – Amadan

+0

謝謝!我有很多東西要學習 – jmancherje

相關問題