関数は、JavaScriptで最も一般的に使用される概念です。 JavaScriptの関数は、開始するのが最も簡単な機能ですが、JavaScriptで理解しマスターすることは最も難しい概念でもあります。
1。関数タイプは、JSの参照タイプの1つです。各関数は、実際には関数タイプのインスタンスオブジェクトであり、独自のプロパティとメソッドを備えています。関数オブジェクトのため、関数名は実際には関数オブジェクトへのポインターです。
2.一般的に使用される関数定義方法
1。関数宣言:
関数合計(a、b){return a+b;}2。表現:
var sum = function(){return a+b; }; // semicolonに注意してください// 2つの方法の違いは次のとおりです。式を使用する場合、パーサーが解釈および実行される前に配置されるコードラインに実行されるまで待機する必要があります(変数宣言は進められ、値が所定の位置に残されています)アラート(合計(10、10))。関数合計(a、b){a+bアラート(sum(10、10)); var sum = function(a、b){return a+b3.関数名は関数オブジェクトへのポインターのみを保持するため、関数名はオブジェクトポインターを含む他の変数と違いはありません。つまり、関数オブジェクトは複数の名前を持つことができます。
関数合計(a、b){return a+b;} console.log(sum(2、3)); // 5var anothersum = sum; //変数Anothersumは、同じ関数オブジェクトconsole.log(anothersum(4、5))も指しています。 // 9sum = null; //合計変数は、function object console.log(anothersum(1、3))にポインターを保存しなくなりました。 //変数Anothersumsは引き続き呼ばれます4.なぜJSがコンセプトに過負荷にならないのか。
関数add(a){return a+3;}関数add(a){return a+5;} var result = add(3); // 8 // 2つの関数の名前は同じ名前で、結果は後者の関数のみを上書きすることができるため、リロードできません5。関数の内部プロパティ:関数内には、2つの特別なオブジェクト、引数とこれがあります
1。議論:
引数は、着信関数のすべてのパラメーターを含むクラスの配列オブジェクトです。このオブジェクトには、Calleeと呼ばれる属性があります。プロパティ値はポインターであり、引数オブジェクトを所有する関数自体を指しています。
function foo(){var a = arguments.callee; return a.toString();} foo();/*結果を返します: "function sum(){var a = arguments.callee; return a.tostring();}"それは、関数内で、arguments.calleeは関数自体を指します。この関数は、再帰的に呼ばれ、多くの欠陥があり、ES5厳密なモードで削除されている場合*/2。これ:簡単に言えば、これは関数が実行される環境オブジェクトを指します。これは、オブジェクトが実行されるオブジェクトを指します。拡張するのは非常に複雑で、たった1つの記事です
// todo:
3。ES5関数の別のプロパティ:発信者を指定します。この関数プロパティは、現在の関数を呼び出す関数を指します。
function inenter(){console.log(inner.caller);} function outer(){inner();} outours(); // function outer(){inner();}4。長さの属性:関数が受け入れたいパラメーターの数を示します
関数add(a、b、c){return a+b+c;} add.length; // 35。有名なプロトタイプ属性は、単にputすることで、特定のタイプのすべてのインスタンスで共有できるプロパティとメソッドを含むコンストラクターを呼び出すことによって作成されたオブジェクトです。拡張するのは非常に複雑で、たった1つの記事です
// todo:
6.関数の2つの方法:call()とapply()。どちらも特定の範囲で関数を呼び出し、実際には関数内でこの値を設定します。
1。CALL():Apply()メソッドと同様に、違いはパラメーターを受信する方法が異なり、パラメーターを1つずつリストする必要があることです。
2。Apply():2つのパラメーターを受信します。1つは関数操作の範囲であり、もう1つはパラメーターの配列であり、引数クラスの配列または配列オブジェクトです。
関数合計(a、b){return a+b;}関数callum(a、b){return sum.apply(this、arguments);} // 2番目のパラメーターはcallum1(a、b){return sum.apply(this、[a、b]);} // 2番目のパラメーターはアレイコンソールです。 // 5 console.log(callum1(3、5)); // 83.パラメーターと呼び出し関数の渡しは、call()およびapply()が使用される場所ではありません。拡張関数の操作についての本当の強力なことは
var color = 'red'; var obj = {color: 'blue'} function foo(){console.log(this.color); } foo(); //'RED'FOO.CALL(this );//'red'foo.call(obj); // 'Blue' // Foo()関数への最後の呼び出しの実行環境が変更され、これはOBJオブジェクトを指しているため、「青」ですcall()とapply()を使用して範囲を拡張することの最大の利点は、オブジェクトとメソッドを切り離すことです
4。ES5は、新しい方法を定義します:BIND()は関数を返します。この値は、この値がbind()関数に渡された値にバインドされます。
var x = 9; var module = {x:81、getx:function(){return this.x; }}; module.getX(); // 81var retivex = module.getx; retivex(); // 9、この場合、「この」はグローバル変数var boundgetx = retivex.bind(module); // moduleにretivex()関数でこれを永遠にバインドし、この関数を呼び出してモジュールオブジェクトで常にbundgetx()を実行するように呼び出します。 // 81上記は、編集者によって導入されたJavaScriptの関数タイプの詳細な分析です。それがあなたに役立つことを願っています。もっと知りたい場合は、wulin.comに注意してください。