クローズドパッケージ
2729 ワード
クローズドパッケージ
私は自覚的にJavaScriptを勉強したことがありません.それがなければ、実際の作業でAJAXアプリケーションを作成する準備が十分ではないことに気づいたので、早く理解しなければなりません.最初は、私のプログラミングのレベルがいくつか下がったような気がしました.(JavaScript!私のC++友達はどう言いますか?)しかし、最初の障害を克服すると、JavaScriptは実際には機能が強く、表現力が強く、非常に簡潔な言語であることに気づきました.他のよりポピュラーな言語でサポートされ始めたばかりの機能もあります.
JavaScriptのより高度な機能の1つは、C 2.0が匿名メソッドでサポートする閉パッケージをサポートする機能です.クローズド・パッケージは、内部関数(またはC#の内部匿名メソッド)が外部関数のローカル変数にバインドされたときに発生する実行時の現象です.この内部関数が何らかの方法で外部関数にアクセスされない限り、あまり意味がないことは明らかです.インスタンスは、この点をよりよく説明することができます.
フィルタリングに合格し、残りの数値を無視するには、100より大きい数値のみが必要であると仮定します.このため、図8のような関数を記述することができる.
Figure 8述語に基づいて要素をフィルタする
ただし、フィルタを通過するには300より大きい数値しかないと仮定して、次のような関数を作成します.
次に、50、25、10、600より大きい数字をフィルタする必要があるかもしれませんが、賢い人としては、すべて同じ述語「greater than」があり、数字だけが違います.したがって、次のような関数で各数値を分けることができます.
これにより、次のコードを作成できます.
関数makeGreaterThanPredicateが返す内部匿名関数を観察すると,この匿名内部関数はlowerBoundを用い,後者はmakeGreaterThanPredicateに渡されるパラメータであることが分かった.役割ドメインの一般的なルールに従って、makeGreaterThanPredicateが終了すると、lowerBoundは役割ドメインを超えます!しかし、ここでは、内部匿名関数は依然としてlowerBoundを携帯しており、makeGreaterThanPredicateが終了してからも長い間そうだった.これが私たちが言った閉鎖です.内部関数は、定義された環境(すなわち、外部関数のパラメータとローカル変数)を閉じるためです.
最初は閉パッケージの機能が強く感じられないかもしれません.しかし、適切に適用すれば、アイデアをコードに変換するのに非常に創造的に役立ちます.このプロセスはとても面白いです.JavaScriptでは、閉パッケージの最も興味深い用途の一つは、シミュレーションクラスのプライベート変数です.
次のセクション:プライベート属性のシミュレーション
私は自覚的にJavaScriptを勉強したことがありません.それがなければ、実際の作業でAJAXアプリケーションを作成する準備が十分ではないことに気づいたので、早く理解しなければなりません.最初は、私のプログラミングのレベルがいくつか下がったような気がしました.(JavaScript!私のC++友達はどう言いますか?)しかし、最初の障害を克服すると、JavaScriptは実際には機能が強く、表現力が強く、非常に簡潔な言語であることに気づきました.他のよりポピュラーな言語でサポートされ始めたばかりの機能もあります.
JavaScriptのより高度な機能の1つは、C 2.0が匿名メソッドでサポートする閉パッケージをサポートする機能です.クローズド・パッケージは、内部関数(またはC#の内部匿名メソッド)が外部関数のローカル変数にバインドされたときに発生する実行時の現象です.この内部関数が何らかの方法で外部関数にアクセスされない限り、あまり意味がないことは明らかです.インスタンスは、この点をよりよく説明することができます.
フィルタリングに合格し、残りの数値を無視するには、100より大きい数値のみが必要であると仮定します.このため、図8のような関数を記述することができる.
Figure 8述語に基づいて要素をフィルタする
<script>
function filter(pred, arr)
{
var len = arr.length;
var filtered = []; // shorter version of new Array();
// iterate through every element in the array...
for(var i = 0; i < len; i++)
{
var val = arr[i];
// if the element satisfies the predicate let it through
if(pred(val))
{
filtered.push(val);
}
}
return filtered;
}
var someRandomNumbers = [12, 32, 1, 3, 2, 2, 234, 236, 632,7, 8];
var numbersGreaterThan100 = filter
(
function(x)
{
return (x > 100) ? true : false;
},
someRandomNumbers
);
// displays 234, 236, 632
alert(numbersGreaterThan100);
</script>
ただし、フィルタを通過するには300より大きい数値しかないと仮定して、次のような関数を作成します.
var greaterThan300 = filter
(
function(x)
{
return (x > 300) ? true : false;
},
someRandomNumbers
);
次に、50、25、10、600より大きい数字をフィルタする必要があるかもしれませんが、賢い人としては、すべて同じ述語「greater than」があり、数字だけが違います.したがって、次のような関数で各数値を分けることができます.
function makeGreaterThanPredicate(lowerBound)
{
return function(numberToCheck)
{
return (numberToCheck > lowerBound) ? true : false;
};
}
これにより、次のコードを作成できます.
var greaterThan10 = makeGreaterThanPredicate(10);
var greaterThan100 = makeGreaterThanPredicate(100);
alert(filter(greaterThan10, someRandomNumbers));
alert(filter(greaterThan100, someRandomNumbers));
関数makeGreaterThanPredicateが返す内部匿名関数を観察すると,この匿名内部関数はlowerBoundを用い,後者はmakeGreaterThanPredicateに渡されるパラメータであることが分かった.役割ドメインの一般的なルールに従って、makeGreaterThanPredicateが終了すると、lowerBoundは役割ドメインを超えます!しかし、ここでは、内部匿名関数は依然としてlowerBoundを携帯しており、makeGreaterThanPredicateが終了してからも長い間そうだった.これが私たちが言った閉鎖です.内部関数は、定義された環境(すなわち、外部関数のパラメータとローカル変数)を閉じるためです.
最初は閉パッケージの機能が強く感じられないかもしれません.しかし、適切に適用すれば、アイデアをコードに変換するのに非常に創造的に役立ちます.このプロセスはとても面白いです.JavaScriptでは、閉パッケージの最も興味深い用途の一つは、シミュレーションクラスのプライベート変数です.
次のセクション:プライベート属性のシミュレーション