まず概念があります。この言語は関数をサポートする言語ではありません。この言語は「関数型言語」と呼ばれます。関数型言語の関数には、呼び出されるだけでなく、他のプロパティもあります。ポイントは次の 3 つです。
1. 関数はオペランドです
2. 機能内でデータを保存する
3. 関数内の操作は関数の外に副作用を持ちません。
1. 関数はオペランドです
通常の関数を呼び出す場合、関数は演算子であり、渡されるパラメータはオペランドであると抽象的に理解できます。
ただし、JavaScript の関数が別の関数のパラメーターとして使用される場合、参照が渡され、この「入力パラメーター」はオペランドとして理解できます。結論としては、関数 (「入力パラメーター」として) にはオペランドの意味があり、「関数パラメーター」は通常のパラメーターと何ら変わりません。
2. 機能内でデータを保存する
命令型言語では、関数内のプライベート変数(ローカル変数)を保存できません。プログラム実行の観点から見ると、ローカル変数はスタック上に確保され、関数の実行終了後に占有されていたスタックは解放されます。したがって、関数内のデータは保存できません。
JavaScript 関数では、関数内のプライベート変数を変更でき、再度関数に「入る」と、変更された状態が継続されます。次の例は、この機能を示しています。
次のようにコードをコピーします。
var セット、取得;
関数 MyFunc(){
変数値 = 100;
関数 set_value(v){
値 = v;
}
関数 get_value(){
戻り値;
}
セット = セット値;
取得 = 取得値;
}
MyFunc();
console.log(get()); //100
セット(300);
console.log(get()); //300
明らかな利点は、データの一部を関数内で永続化できる場合、データが異なる In に存在するため、インスタンスに割り当てられたとき、および複数のインスタンス間で、関数が (コンストラクターとして) データを使用して操作を実行できることです。閉じても、相互に影響を与えることはありません。
オブジェクト指向の用語で説明すると、さまざまなインスタンスが独自のプライベート データ (パブリック データからコピーしたもの) を持っていることを意味します。次の例は、この機能を示しています。
次のようにコードをコピーします。
関数 MyObject(){
変数値 = 100;
this.setValue = function(){
値 = v;
}
this.showValue = function(){
console.log(値);
}
}
var obj1 = 新しい MyObject();
var obj2 = 新しい MyObject();
obj2.setValue(300);
obj1.showValue(); //100;
3. 関数内の操作は関数の外に副作用を持ちません。
この機能の意味は次のとおりです。
* この関数は、エントリ パラメータを変更せずに操作を実行するために使用します (変数パラメータではなく値パラメータとして使用されます)
※関数外の他のデータ(グローバル変数など)の値は操作中に変更されません。
※演算完了後、「関数リターン」により値を外部システムに転送します。
このような関数は、動作中に外部システムに副作用を与えません。ただし、JavaScript では関数内でグローバル変数を参照および変更でき、さらにグローバル変数を宣言することもできることに気付きました。これは実際にその機能特性を破壊します。
さらに、JavaScript ではオブジェクトと配列のメンバーを関数内で変更することもできます。これらのメンバーは、オブジェクト システムの外部の他の関数ではなく、オブジェクト メソッドによって変更する必要があります。
つまり、JavaScript のこの機能は、開発者のプログラミング習慣によってのみ保証されます。