javascript function(関数タイプ)使用と注意事項のまとめ


本論文の実例は、javascript function(関数タイプ)の使用と注意事項を述べている。皆さんに参考にしてあげます。具体的には以下の通りです。
ECMAScriptでは、Functionタイプが実際に対象です。各関数は、Functionタイプの例であり、他の参照タイプと同様に属性と方法を有する。関数はオブジェクトなので、関数名は実際に関数オブジェクトを指すポインタでもあります。
学習のポイント:
1.関数の宣言方法
2.値の関数として
3.関数の内部属性
4.関数の属性と方法
一.関数の宣言方式
1.一般的な関数宣言

function box(num1, num2) {
  return num1+ num2;
}

2.変数初期化関数を使用する

var box= function(num1, num2) {
  return num1 + num2;
};

3.Functionコンストラクターを使用する

var box= new Function('num1', 'num2' ,'return num1 + num2');

PS:第三の方法は紹介しないです。このような文法は2つのコードを解析することになります。(最初の解析は従来のECMAScriptコードで、2番目は構造関数に入ってきた文字列を解析することです。)ので、性能に影響を与えます。しかし、「関数はオブジェクトであり、関数名はポインタである」という概念はこの文法によって理解できます。
二.値の関数として
ECMAScriptの関数名自体が変数ですので、関数は値としても使えます。つまり、伝達パラメータのように一つの関数を別の関数に渡すだけでなく、一つの関数を別の関数の結果として返すことができます。

function box(sumFunction, num) {
  return sumFunction(num); //someFunction
}
function sum(num) {
  return num + 10;
}
var result = box(sum, 10); //           

三.関数の内部属性
関数の内部には、二つの特殊なオブジェクトがあります。argmentsは、入力関数のすべてのパラメータを含むクラスの配列オブジェクトで、主な用途は保存関数パラメータです。しかし、このオブジェクトにはもう一つのcaleeという属性があります。この属性はポインタで、このargmentsオブジェクトを持つ関数を指します。

function box(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * box(num-1); //        
  }
}

階乗関数については、一般的に再帰的アルゴリズムを使用するので、関数内部では必ず自身を呼び出します。関数名を変更しないなら大丈夫ですが、関数名を変更すると内部の呼び出しは一々変更されます。この問題を解決するために、私たちはarguments.calleeを使って代替できます。

function box(num) {
  if (num <= 1) {
    return 1;
  } else {
    return num * arguments.callee(num-1);//  callee     
  }
}

関数の内部にあるもう一つの特殊なオブジェクトは、JavaとC〓の中のthisとほぼ似ている。言い換えれば、thisが引用するのは、動作を実行するための関数のオブジェクト、または関数呼び出しのステートメントにおけるそのスコープです。PS:グローバルスコープで関数を呼び出すと、thisオブジェクトがwindowを参照します。

//         
window.color = '   '; //   ,  var color = '   ';  
alert(this.color); //     color
var box = {
  color : '   ', //   color
  sayColor : function () {
    alert(this.color); //   this  box  color
  }
};
box.sayColor(); //     color
alert(this.color); //     


//         
window.color = '   '; //  var color = '   ';  

var box = {
  color : '   '
};
function sayColor() {
  alert(this.color); //        ,    box  
}
getColor();
box.sayColor = sayColor; //      box   ,     
box.sayColor();

四.関数の属性と方法
ECMAScriptの関数は対象ですので、関数にも属性と方法があります。各関数には二つの属性があります。lengthとprototype。ここで、length属性は、関数が受信したいネーミングパラメータの個数を表している。

function box(name, age) {
  alert(name + age);
}
alert(box.length); //2

PS:prototype属性については、すべての例示的な方法を保存する本当のところ、すなわちプロトタイプです。この属性は対象に向かって章で詳しく紹介します。prototypeの下には2つの方法があります。apply()call()は、それぞれの関数がこの2つの非継承的な方法を含んでいます。これらの2つの方法の用途はいずれも特定の作用領域で関数を呼び出すが、実際には関数内のthisオブジェクトを設定する値に等しい。

function box(num1, num2) {
  return num1 + num2; //   
}
function sayBox(num1, num2) {
  return box.apply(this, [num1, num2]); //this     ,   window
} //[]  box      
function sayBox2(num1, num2) {
  return box.apply(this, arguments); //arguments    box      
}

alert(sayBox(10,10)); //20
alert(sayBox2(10,10)); //20

call()方法はapply()方法と同じで、彼らの違いは単に受信パラメータの方式が異なるだけである。call()方法に対して、最初のパラメータは作用領域であり、変化はなく、残りのパラメータは直接関数に伝達されるだけである。

function box(num1, num2) {
  return num1 + num2;
}
function callBox(num1, num2) {
  return box.call(this, num1, num2); // apply         
}
alert(callBox(10,10));

実際には、伝達パラメータはapply()call()の方法ではなく、実際の使用場所です。それらがよく使用される場所は、関数を拡張して動作させることができるスコープである。

var color = '   '; //  window.color = '   ';  
var box = {
  color : '   '
};
function sayColor() {
  alert(this.color);
}
sayColor(); //    window
sayColor.call(this); //    window
sayColor.call(window); //    window
sayColor.call(box); //    box,    

この例は、以前の作用領域理解の例によって修正されたもので、我々はcall(box)の方法を使用すると、sayColor()の方法の実行環境がすでにboxオブジェクトの中に変化していることが分かります。call()またはapply()を使用して、スコープを拡張する最大の利点は、オブジェクトが方法との任意の結合関係(結合とは、相互に関連する意味であり、拡張と維持が連鎖反応することがある)を必要としないことである。つまり、boxオブジェクトとsayColor()方法との間には、box.sayColor = sayColor;などの余分な関連操作はありません。
もっと多くのJavaScriptに関する内容は当駅のテーマを調べられます。「JavaScript常用関数技術のまとめ」、「javascript対象向け入門教程」、「JavaScriptエラーとデバッグテクニックのまとめ」、「JavaScriptデータ構造とアルゴリズム技術のまとめ」及び「JavaScript数学演算の使い方のまとめ
本論文で述べたように、JavaScriptプログラムの設計に役に立ちます。