何が起こっているのかを見てみましょうua.js
。タマネギの最外層は無名関数です。
var UA = (function (window, navigator)
{
/* anonymous function contents */
}(window, navigator));
したがって、UA はこの無名関数の戻り値に設定されます。では、無名関数は何をするのでしょうか? 変数を設定しますua
。
var ua = (window.navigator && navigator.userAgent) || "";
detect
ua の内容を に対してテストする無名関数を返す関数を定義します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 が一連のフラグを含むオブジェクトになる別のアプローチを想像することができます。これには、パターン マッチを実行するための (おそらくかなり小さい) オーバーヘッドがあり、開発者としては関心がありません。