1

これは、私が理解できない JavaScript 関数の簡単なパターンです。これは次のとおりです: https://github.com/g13n/ua.js/blob/master/src/ua.js

注: これは、元の質問の回答に対する HugoT の回答に従って編集されたバージョンです。

function D(arg) {
   return function () { 
       return arg > 10; //arg is captured in this function's closure 
   }
};

object = {
    x: D(11),
    y: D(9),
    z: D(12)
};

では、この構造はどのように機能するのでしょうか? リターンがオブジェクトであることがわかります。しかし、私は物事をまとめることができません。これは閉鎖パターンですか?流れを説明できる人いますか?

4

2 に答える 2

3

はい、これは閉鎖パターンです。D に渡された引数はすべて、D から返された関数のクロージャーでキャプチャされます。ただし、記述した内容は、リンクしたコードと同じではありません。

これは、リンクしたコードの重要な部分です。

function D(arg) {
   return function () { 
       return arg > 10; //arg is captured in this function's closure 
   }
};

object = {
    x: D(11),
    y: D(9),
    z: D(12)
};

値 11、9、および 12 は、関数 および でキャプチャさobject.xobject.yますobject.z

したがってobject.x()、 true をobject.y返しますが、 は false であるため false を返し9 > 10ます。object.z()は true を返します。12 > 10

于 2013-10-20T12:14:48.587 に答える
3

何が起こっているのかを見てみましょうua.js。タマネギの最外層は無名関数です。

var UA = (function (window, navigator) 
{ 
   /* anonymous function contents */  
}(window, navigator));

したがって、UA はこの無名関数の戻り値に設定されます。では、無名関数は何をするのでしょうか? 変数を設定しますua

var ua = (window.navigator && navigator.userAgent) || "";

detectua の内容を に対してテストする無名関数を返す関数を定義しますpattern

function detect(pattern) {
    return function () {
        return (pattern).test(ua);
    };
}

を呼び出しdetect(/something/)ても の値は返されないことに注意してください(/something/).test(ua)。オンデマンドでテストを実行するクロージャを返すだけです。

ここで、外部の無名関数の戻り値をヒットします。これは次のようになります (コメントは切り捨てました)。

return { isChrome: detect(/webkit\W.*(chrome|chromium)\W/i),
         isFirefox: detect(/mozilla.*\Wfirefox\W/i),
         isGecko: detect(/mozilla(?!.*webkit).*\Wgecko\W/i),
         ...
         whoami: function () {
           return ua;
         } }

Objectこれは、多くの関数 (isChromeなど)を含むのインスタンスを返します。これらの関数は、 への呼び出しによって作成されたクロージャですdetect()。これは、これらの(pattern).test(ua)チェックの実行が、誰かが実際に呼び出すまで延期されることを意味しUA.isChrome()ます。

すべてのテストが前もって実行され、UA が一連のフラグを含むオブジェクトになる別のアプローチを想像することができます。これには、パターン マッチを実行するための (おそらくかなり小さい) オーバーヘッドがあり、開発者としては関心がありません。

于 2013-10-20T12:37:36.567 に答える