JSと関数言語の三つの特性

1945 ワード

まず一つの概念があります。言語サポート関数ではなく、この言語を「関数言語」といいます。関数言語の関数(function)は、呼び出しに加えて、いくつかの他の性質を持っています。以下の3点があります。1.関数は演算子2です。関数内にデータを保存します。3.関数内の演算は関数外に副作用がありません。1、関数は演算元の普通の関数です。呼び出すと、関数は演算子です。しかし、JavaScriptの関数が別の関数のパラメータとして使用されるときは、伝達参照であり、この「着信パラメータ」は演算元として理解される。この結果、(「着信パラメータ」としての)関数は演算要素の意味を持ち、「関数パラメータ」は通常のパラメータとあまり変わらないと結論した。
二、関数内にデータを保存するコマンド言語では、関数内部のプライベート変数(局所変数)は保存できません。プログラムの実行形態から、局所変数はスタックに割り当てられ、関数実行終了後に占有されたスタックが解放される。したがって、関数内のデータは保存できません。JavaScriptの関数では、関数内のプライベート変数を変更することができます。また、関数の内部に「入る」と、この変更された状態が継続されます。以下の例では、この特性を説明している。

  var set,get;
  function MyFunc(){
      var value = 100;

      function set_value(v){
          value = v;
      }
      function get_value(){
          return value;
      }

      set = set_value;
      get = get_value;
  } 
  MyFunc();
  console.log(get()); //100
  set(300);
  console.log(get()); //300

の明白な利点は、1つのデータが関数内で持続的に保存される場合、この関数がインスタンスに割り当てられた場合、これらのデータを用いて演算することができることである。複数の例の間では、データは異なるクローズドに存在するので、相互に影響を与えない。オブジェクト指向の用語で説明すると、異なる例にはそれぞれのプライベートデータがある(ある共通のデータからコピーされる)。以下の例では、この特性を説明します。

  function MyObject(){
      var value = 100;
      this.setValue = function(){
          value = v;
      }
      this.showValue = function(){
          console.log(value);
      }
  }
  var obj1 = new MyObject();
  var obj2 = new MyObject();

  obj2.setValue(300);
  obj1.showValue(); //100;

、関数内の演算は、関数外に副作用がないという特性の意味は、*関数が入口パラメータを用いて演算し、これを変更しない(変数パラメータではなく値パラメータとして使う)*演算中は関数の外部の他のデータの値(例えばグローバル変数)*演算が終了したら「関数戻り」で外部システムに値を転送します。
このような関数は演算中に外部システムに副作用がない。しかし、JavaScriptは関数の内部でグローバル変数を参照して変更することができ、さらにグローバル変数を宣言することもできることに注目しています。この点は実はその関数的な特性を破壊したのです。これ以外にも、JavaScriptはオブジェクトシステム以外の他の関数ではなく、オブジェクトと配列のメンバーを関数内で変更することができます。だから:JavaScriptのこの特性は開発者のプログラミング習慣によってしか保証できません。