JavaScript関数浅析
3154 ワード
jsでは関数は比較的把握しやすいが、使用状況は最も複雑な技術である.本論文では、以下の点から特徴や使い方を重点的に述べてみます.今後のudateに期待してください.
関数の基本的な特徴 いくつかの関数を定義する方法とその違いは です.関数のいくつかの呼び出し方法 JavaScriptの匿名関数
関数の基本的な特徴:
1、関数は対象のタイプの一つです.(ECMAScriptには5つの簡単なタイプのUdefined、Null、Boolean、Number、Stringがあります.もう1つの複雑なタイプのObjectがあります.)そして標準的な内蔵タイプFunctの例です.
ECMA-622書き込み
function:
member of the Object type that is an instance of the standard built-in Function struct and that may be invoked as a subroutine.関数のパラメータは、内部で1つの配列(argments)を使用して表され、関数内ではargments[index]によって指定パラメータ を取得することができる.戻り値が指定されていない場合、自動的にundefined に戻ります.
3、jsでは、関数は再ロードされていません.2つの名前が同じ関数を定義した場合、この関数名は後の定義者(または上書きと略称します)に属します.
関数の定義
大きく分けて次の3つになります.
違い:
第一の定義方式:従来方式であり、詳細には説明しない.
第二の定義方式:比較的特殊ですが、基本的な特徴は第一と似ています.関数がオブジェクトであるため、関数名は実際には関数オブジェクトを指すポインタでもあるので、第二の定義は実質的に同じです.まず匿名関数を定義して、その値を変数に割り当てます.
第三の定義方式:Functionコンストラクタでは、パラメータはそれぞれいくつかの形参と関数の具体的な実現コードである.このように定義すると、2回の解析(ECMAScriptコードを一回解析して、コンストラクタに入ってくる文字列を一回解析する)と、コードの読み取り可能性とスクリプト注入の問題があるので、使用を推奨しない.
js解析器が環境にデータをロードする場合、前の2つの方式は完全に同じではない.
解析器はまず関数宣言を読み取り、任意のコードを実行する前にアクセスできるようにします.関数式は、解像度が彼のコード行に実行されるまで、本当に解釈されて実行される必要があります.
この違いを除いて、関数宣言と関数表現の文法は実は同等です.
関数のいくつかの呼び出し方法:
1、従来の方式は、詳細には説明しない.
2、アプリ
applyとcallは、使用シーンにおいて、主に関数頼を拡張して動作させるためのスコープであるが、この点については、従来の呼び出し方式では実現しにくい.
関数の基本的な特徴:
1、関数は対象のタイプの一つです.(ECMAScriptには5つの簡単なタイプのUdefined、Null、Boolean、Number、Stringがあります.もう1つの複雑なタイプのObjectがあります.)そして標準的な内蔵タイプFunctの例です.
ECMA-622書き込み
function:
member of the Object type that is an instance of the standard built-in Function struct and that may be invoked as a subroutine.
function demo() {
}
alert(typeof demo);//function, , object
2、関数が定義されている場合は、パラメータと戻り値が選択されます.3、jsでは、関数は再ロードされていません.2つの名前が同じ関数を定義した場合、この関数名は後の定義者(または上書きと略称します)に属します.
関数の定義
大きく分けて次の3つになります.
//1.
function demo1(){}
//2.
var demo2=function(){};// , js
//3. Function
var demo3=new Function("m","n","return m+n;");//
違い:
第一の定義方式:従来方式であり、詳細には説明しない.
第二の定義方式:比較的特殊ですが、基本的な特徴は第一と似ています.関数がオブジェクトであるため、関数名は実際には関数オブジェクトを指すポインタでもあるので、第二の定義は実質的に同じです.まず匿名関数を定義して、その値を変数に割り当てます.
第三の定義方式:Functionコンストラクタでは、パラメータはそれぞれいくつかの形参と関数の具体的な実現コードである.このように定義すると、2回の解析(ECMAScriptコードを一回解析して、コンストラクタに入ってくる文字列を一回解析する)と、コードの読み取り可能性とスクリプト注入の問題があるので、使用を推奨しない.
js解析器が環境にデータをロードする場合、前の2つの方式は完全に同じではない.
解析器はまず関数宣言を読み取り、任意のコードを実行する前にアクセスできるようにします.関数式は、解像度が彼のコード行に実行されるまで、本当に解釈されて実行される必要があります.
alert(demo1(3,4));
function demo1(m,n){
return m+n;
}
このコードの運行は大丈夫です.最終的な答えは「7」です.alert(demo2(3,4));
var demo2=function(m,n){
return m+n;
};
このコードは実行中にエラーが発生します.関数のある文を実行する前に変数demo 2は関数への参照を保存しません.この違いを除いて、関数宣言と関数表現の文法は実は同等です.
関数のいくつかの呼び出し方法:
1、従来の方式は、詳細には説明しない.
2、アプリ
function add(n1, n2) {
return n1 + n2;
}
//param1:
//param2:Array
alert(add.apply(this, [ 1, 2 ]));// ,
alert(add.apply(window, [ 1, 2 ]));
3、コールfunction add(n1, n2) {
return n1 + n2;
}
//param1:
//param2: ,
alert(add.call(this, 1, 2 ));
alert(add.call(window, 1, 2 ));
基本的にこの2つの呼び出し方法の違いは、2番目のパラメータであり、applyは1つの配列の例に入る必要があり、callはjavaの可変パラメータであり、1つずつ羅列しなければならない.applyとcallは、使用シーンにおいて、主に関数頼を拡張して動作させるためのスコープであるが、この点については、従来の呼び出し方式では実現しにくい.
var gender = "female";
var obj = {
gender : "male"
};
function demo() {
alert(this.gender);
}
demo(this);//female
demo.call(window);//
demo.call(obj);//male
callとappyを使って、実際には関数との結合関係を解除しました.あるいは、appyとcallはJavaの反射に似ています.method.invoke(obj,args)