今回は、以前の記事「高品質のJSコードの書き方」を続行します。JavaScript関数の知識ポイントを整理します。
2。関数を使用します
関数は、プログラマーに主な抽象関数と実装メカニズムを提供します。関数は、手順、メソッド、コンストラクター、さらにはクラスやモジュールなど、他の言語に複数の異なる機能を独立して実装できます。
2.1関数呼び出し、メソッド呼び出し、コンストラクター呼び出しの違いを理解する
オブジェクト指向プログラミングの場合、機能、メソッド、クラスのコンストラクターは3つの異なる概念です。
使用モード:
1。関数呼び出し
コードコピーは次のとおりです。
function hello(username){
「hello」 + usernameを返します。
}
2。メソッド呼び出し
コードコピーは次のとおりです。
var obj = {
こんにちは:function(){
「Hello」 + this.usernameを返します。
}、
ユーザー名:「Floralam」
};
ohj.hello(); // "こんにちは、floralam"
HelloメソッドはOBJオブジェクトで定義されているため、この変数はオブジェクトにバインドされます。同じ関数参照のコピーを別のオブジェクトに割り当てて、同じ答えを取得することもできます。
コードコピーは次のとおりです。
var obj2 = {
こんにちは:obj.hello()、
ユーザー名:「Floralam」
};
3.コンストラクターを使用します
コードコピーは次のとおりです。
function user(name、passwordhash){
this.name = name;
this.passwordhash = passwordhash;
}
新しいオペレーターを使用してユーザーを呼び出すことは、コンストラクターと見なされます。
コードコピーは次のとおりです。
var u = new user( "Floralam"、 "123");
関数呼び出しやメソッド呼び出しとは異なり、コンストラクターコールはこの変数の値として完全に新しいオブジェクトを取り、この新しいオブジェクトをコールの結果として暗黙的に返します。コンストラクターの主な責任は、新しいオブジェクトを初期化することです。
2.2高度な機能に習熟
高次関数は、パラメーターまたは戻り値として関数を使用し、パラメーターとして関数を使用する関数(通常はコールバック関数と呼ばれる関数)にすぎません。これは、高次関数が「その後「それを呼び出す」)は特に強力で表現力のあるイディオムであり、JSプログラムでも広く使用されているためです。
配列の標準的な種類の方法を検討してください。すべての配列で作業するために、ソートメソッドでは、発信者が配列内の2つの要素を比較する方法を決定する必要があります。
コードコピーは次のとおりです。
function comparenumber(x、y){
if(x <y){
return -1;
}
if(x> y){
返品1;
}
0を返します。
}
[3,1,4,1,5,9] .SORT(ComparENumbers); // [1,1,3,4,5,9]
コードコピーは次のとおりです。
[3,1,4,1,5,9] .sort(function(x、y){
if(x <y){
return -1;
}
if(x> y){
返品1;
}
0を返します。
}); // [1,1,3,4,5,9]
上記の例では、匿名関数を使用してさらに簡素化します。
高次関数を使用することを学習すると、多くの場合、コードを簡素化し、退屈なボイラープレートコードを排除できます。文字列アレイを簡単に変換するために、ループを使用して次のように実装できます。
コードコピーは次のとおりです。
var names = ["fred"、 "wilma"、 "Pebbles"];
var upper = [];
for(var i = 0、n = names.length; i <n; i ++){
upper [i] = names [i] .touppercase();
}
upper; // ["fred"、 "wilma"、 "Pebbles"];
便利なマップアレイのメソッドを使用して、1つのローカル関数のみを使用して、ループを排除し、要素を1つずつ変換できます。
コードコピーは次のとおりです。
var names = ["fred"、 "wilma"、 "Pebbles"];
var upper = names.map(function(name){
return name.touppercase();
});
upper; // ["fred"、 "wilma"、 "Pebbles"];
さらに、たとえば、共通の実装ロジックを使用して異なる文字列を作成するためのいくつかの方法を作成し、各ループは、各独立した部分の計算結果を接続することにより文字列を作成します。
コードコピーは次のとおりです。
関数Bulidstring(n、callback){
var result = "";
for(var i = 0; i <n; i ++){
result += callback(i);
}
返品結果;
}
var alphabet = bulidstring(26、function(i){
return string.fromCharcode(aindex + i);
});
alphabet; // "abcdefghijklmnopqrxtuvwxyz";
var digits = buildstring(10、function(i){return i;})
数字; // "0123456789"
varランダム= buildstring(9、function(){
RANDAM += String.FromCharcode(Math.Floor(Math.Random()*26) +Aindex
});
ランダム; // "yefjmcef"(ランダム)
これにより、読者は、詳細な実装の詳細なしでコードができることをより明確に理解することができます。
述べる
JavaScript指定された範囲の乱数(MNの間)の式を返します:math.random()*(nm)+m
同時に、質問の要件と、肯定的な整数を返す必要があるかどうかに注意してください。
2.3コールモード
関数を呼び出すと、現在の関数の実行が一時停止し、制御権とパラメーターを新しい関数に合格します。宣言時に定義された正式なパラメーターに加えて、各関数は、これと引数の2つの新しい追加パラメーターを受信します。
これは非常に重要なパラメーターであり、その値は呼び出しパターンによって決定されます。
JavaScriptの4つの非常に重要な呼び出しパターンを次に示します。
a。メソッドの呼び出しパターン
b。関数の呼び出しパターン
c。コンストラクターの呼び出しパターン
d。適用コールパターンの適用呼び出しパターン
これらのパターンがキーパラメーターを初期化する方法には違いがあります
1。メソッド呼び出しメソッド
関数がオブジェクトの方法である場合、それをメソッドと呼びます。メソッドが呼び出されると、これは呼び出されたオブジェクトにバインドされます。
コードコピーは次のとおりです。
var myobj = {
Val:0、
増分:function(inc){
this.val+= typeof inc === "number"? Inc:1;
}、
get_val:function(){return this.val;}
}
myobj.increment(); // 1
myobj ["increment"](2); // 3
まとめ:
1.それらが属するオブジェクトのコンテキストをこれを通して取得できる方法は、パブリックメソッドと呼ばれます
2。aで関数を使用する場合。または字幕式、それはメソッドコールモードであり、このオブジェクトは前のオブジェクトにバインドされます。
3.関数はこれを使用してオブジェクトにアクセスできるため、オブジェクトの値を取得したり、オブジェクトの値を変更したりできます。これをオブジェクトにバインドすると、呼び出されたときに発生します。
2。関数の呼び出しパターン
関数がオブジェクトのプロパティではない場合、それは関数と呼ばれます。関数が関数呼び出しパターンと呼ばれる場合、これはグローバルオブジェクトにバインドされます。これはJavaScriptの設計エラーであり続けます。
コードコピーは次のとおりです。
関数add(x、y){
x+yを返します。
}
myobj.double = function(){
var that = this;
var helper = function(){
that.val = add(that.value、that.value);
//間違った執筆方法はこんな感じかもしれませんが、なぜ間違っているのですか?関数が内部関数と呼ばれると、これは間違ったオブジェクトにバインドされており、グローバルオブジェクトにはVALプロパティがないため、誤った値が返されます。
//this.val = this.val+this.val;
}
ヘルパー();
}
myobj.double(); // 6
3。コンストラクターの呼び出しパターン
JavaScriptはプロトタイプの継承に基づいた言語です。つまり、オブジェクトは他のオブジェクトから属性を直接継承できることを意味し、言語はクラスレスです。
新しいものを使用して関数を呼び出すと、関数に接続されたプロトタイプメンバーを隠す新しいオブジェクトが取得され、これは新しいオブジェクトにもバインドされます。
新しいプレフィックスは、returnステートメントの動作も変更します。これは推奨されるプログラミング方法でもありません。
コードコピーは次のとおりです。
var foo = function(status){
this.status = status;
}
foo.prototype.get_status = function(){
this.statusを返します。
}
// fooインスタンスを作成します
var myfoo = new foo( "bar");
myfoo.get_status(); // "bar"
4.適用パターンを呼び出してください
JavaScriptは機能的なオブジェクト指向言語であるため、関数にはメソッドがあります。
Applyメソッドには2つのパラメーターがあります。 1つ目はこれに値をバインドすることであり、2つ目はパラメーター配列です。つまり、Applyメソッドにより、配列を構築し、それを使用して関数を呼び出すことができます。これにより、この値を選択でき、配列の値を選択できます。
コードコピーは次のとおりです。
var array = [3,4];
var sum = add.apply(null、array); // 7
var statusobj = {status: "abcdefg"};
foo.prototype.pro_get_status = function(prefix){
return prefix +" - " +this.status;
}
var status = foo.prototype.get_status.apply(statusobj); // "abcdefg"
var pro_status = foo.prototype.get_status.apply(statusobj、["prefix"]); // "prefix -abcdefg"
通常、関数またはメソッドの受信者(この特別なキーワードの値にバインドされたレベル)は、発信者の構文によって決定されます。特に、メソッドコール構文は、ルックアップオブジェクトによってこの変数にメソッドにバインドします。ただし、カスタムレシーバーを使用して関数を呼び出す必要がある場合があります。現時点では、コールメソッドまたはバインドメソッドを使用してレシーバーをカスタマイズしてメソッドを呼び出す必要があります
2.4 BINDメソッドを使用して受信者を定義する方法を抽出します
この方法は、値が関数である属性と違いはないため、オブジェクトのメソッドを抽出し、コールバック関数として関数を抽出し、それを高次関数に直接渡すことも簡単です。
しかし、抽出された関数を抽出されたオブジェクトに結合するのを忘れがちです。
コードコピーは次のとおりです。
var buffer = {
エントリ:[]、
追加:function(s){
this.entries.push(s);
}
}
var source = ["867"、 " - "、 "5309"];
source.foreach(butter.add); //エラー:エントリは未定義です
現時点では、バターの受信者はバターオブジェクトではありません。関数の受信機はそれがどのように呼び出されるかに依存し、foreachメソッドはグローバル範囲で呼び出されます。したがって、foreachメソッドの実装は、グローバルオブジェクトをデフォルトのレシーバーとして使用します。グローバルオブジェクトにはエントリ属性がないため、このコードはエラーをスローします。
foreachメソッドにより、発信者はコールバック関数の受信者としてオプションのパラメーターを提供できます。
コードコピーは次のとおりです。
var source = ["867"、 " - "、 "5309"];
source.foreach(butter.add、butter);
しかし、すべての高次関数が、コールバック関数の受信者をユーザーに提供するように慎重かつ思慮深いわけではありません。
2つの解決策があります。
1)明示的なバッファオブジェクトメソッドを作成して、カプセル化関数の追加を呼び出します。カプセル化関数がどのように呼び出されるかに関係なく、そのパラメーターがターゲット配列に押し込まれることを常に保証します。
コードコピーは次のとおりです。
var source = ["867"、 " - "、 "5309"];
source.foreach(function(s){
butter.add(s);
});
2)関数オブジェクトのバインドメソッドは、受信機オブジェクトを必要とし、受信機オブジェクトによって呼び出されるメソッドを使用して元の関数を呼び出すカプセル化関数を生成します。
コードコピーは次のとおりです。
var source = ["867"、 " - "、 "5309"];
source.foreach(butter.add.bind(buffer));
述べる
buffer.add.bind(buffer)buffer.add関数を変更する代わりに、新しい関数を作成します。
buffer.add === buffer.add.bind(buffer); //間違い
上記はこの記事のすべてです。あなたがそれを気に入ってくれることを願っています。