20

node.js フレームワークであるFabを紹介するスライドを見たことがあります。

素晴らしいスライド

これはJavaScriptですか?

誰かがそのコードで何が起こっているのか説明できますか?

私はすべて迷っています。

4

2 に答える 2

23

プレーンな JavaScript であり、関数連鎖パターンです。

最初の行に( fab = require("fab") )は、fab関数が含まれており、その参照を返します。

後続の括弧はすべて関数呼び出しであり、各関数呼び出しはおそらく同じ関数を何度も返します。

パターンは、おそらく次の単純化された例のようになります。

var foo = function (arg) {
  // detect what the argument is
  if (typeof arg == 'function') {
    // do something with arg
    console.log('function: '+arg());
  } else if (arg instanceof RegExp) {
    // arg is a RegExp...
    console.log('A RegExp: '+arg);
  } else if (typeof arg == "string") {
    // arg is a string
    console.log('A string: '+arg);
  }
  return foo; // return a reference to itself
};

(foo)
  (function() { return "Foo "; })
  (/bar/)
  (" baz!");

出力:

関数: フー
正規表現: /bar/
ひも:バズ!
于 2010-09-26T18:40:49.410 に答える
9

それは確かに理解するのが難しいです。Javascriptのようには見えません...

とにかく、FAB は呼び出された関数へのポインターを返すことを利用します。例えば:

function doSomething(str){
  alert(str);
  return arguments.callee;
}

// Alerts 'hi' and then 'there'
doSomething('hi')('there');

もちろん、引数の数をカウントしたり、渡された引数のタイプをチェックしたりするなど、追加の条件を実装することもできます。例:

function doSomething(){
  if(arguments.length == 1){
    alert(arguments[0])
  } 
  else if(arguments.length == 2){
    alert(arguments[0] + arguments[1]);
  }

  return arguments.callee;
}

doSomething
  ("Hi, 3 + 4 is:")
  (3, 4);

最後の例は次のように警告します。

> Hi, 3 + 4 is:
> 7
于 2010-09-26T18:43:11.263 に答える