functionNN 2 IE 3 ECMA 1

関数とは、ページの読み込み中または読み込み後に呼び出すことができる、スクリプトステートメントの集まりを指します。関数を呼び出す方法は簡単です。関数名の後にかっこを付けてスクリプトステートメントで指定するか、HTML タグのイベントハンドラー属性の値として指定します。

 

スクリプトが有効なブラウザではすべて、関数の作成は script 要素内で次のように関数を定義することによって行います。

 
function funcName() {...}
 

最近のブラウザではコンストラクタ関数を使用できますが、その場合は関数定義よりも複雑な構文が必要です。

 

関数は、0 個以上のパラメータを受け入れることができます。受け入れたパラメータは、関数名の後にあるかっこの中で定義されたコンマで区切ったパラメータ変数に割り当てられます。

 
function doSomething(param1, param2, ... paramN) {...}
 

パラメータの値には、オブジェクト参照や配列を含むすべての JavaScript データタイプを使用できます。関数呼び出しで、関数定義と同じ数のパラメータを指定しなくても特に問題はありません。関数はパラメータを arguments という配列として受け入れ、関数内のスクリプトステートメントがこの配列から必要なパラメータデータを取得します。

 

関数の最後のステートメントが実行された時点で、それを呼び出したステートメントに制御が返されます。関数は return ステートメントを使って、呼び出し元のステートメントに値を返す場合もあります。また、関数の途中で return ステートメントを使用すると、関数ステートメントの実行が中断され、呼び出しステートメントに制御が返されます。その際に値を返すことも可能です。関数内の条件分岐構造の 1 つの分岐が値を返す場合、メインの分岐を含むすべての分岐が何らかの値を返す必要があります。値は null でもかまいません。IE では、各分岐に return ステートメントがなくても処理は行われますが、この方法がいいプログラミングの慣例であることは変わりません。

 

関数からは、関数の外で定義されているドキュメントの全グローバル変数にアクセスできます。ただし、特定の関数の中で定義されている変数 (var キーワードが必要) には、その関数内のステートメントからしかアクセスできません。

 

ドキュメントのそれ以外の場所で定義されている関数オブジェクトに参照するには、かっこを付けずに関数名を使用します。たとえば、イベントハンドラープロパティに関数を割り当てるには、次の構文を使用します。

 
objReference.eventHandlerProperty = functionName;
 

バージョン 4 以降のブラウザでは、次のように関数をネストすることができます。

 
function myFuncA() {
    statements
    function myFuncB() {
        statements
    }
}
 

myFuncB のようにネストされた関数は、そのすぐ外側にある関数内のステートメントによってのみ呼び出すことができます。

 

すべての関数は、それが定義されたウィンドウに所属します。したがって、スクリプトから兄弟フレームの中にある関数にアクセスするには、次のように参照にフレームと関数の名前を含める必要があります。

 
parent.otherFrame.someFunction()
 
関数の作成方法
 
function myFunction([param1[, param2[,...paramN]]]) {
    statement(s)
}
var myFunction = new Function([param1[,...paramN], "statement1[; ...statementN;"])
objectRef.methodName = function([param1[, param2[,...paramN]]]) {
    statement(s)
}
 
プロパティ
 
argumentsaritycallerconstructorlengthprototype
 
メソッド
 
apply()
 toString()
 call()
 valueOf()
 
argumentsNN 3 IE 4 ECMA 1

読み取り専用

パラメータとして関数に渡された値を含む arguments オブジェクトを返します。関数内のスクリプトステートメントでは、配列構文を使用して値にアクセスできます。配列には、パラメータが渡された順序で、パラメータ値に対応する数値インデックス値があります。arguments 配列の内容は、関数で定義されたパラメータ変数には依存しません。したがって、関数でパラメータが 2 つ定義されていても、呼び出しステートメントがパラメータを 10 個渡した場合は、arguments 配列には 10 個すべての値が渡された順序で保存されます。その後、関数内のステートメントで arguments 配列の長さを調べ、必要に応じてそこから値を取得します。これによって、必要であれば 1 つの関数で不特定数のパラメータを処理することができます。

 

ほとんどのブラウザでは、arguments[2] のように、オブジェクトへの参照をプロパティ名から開始できます。ただし、一部の古いブラウザでは、関数オブジェクトの名前も必要です。長いフォーマットはすべてのブラウザで認識されます。

 
function myFunc()
    for (var i = 0; i < myFunc.arguments.length; i++) {
        ...
    }
}
 

arguments オブジェクト

 
arityNN 4 IE なし ECMA なし

読み取り専用

関数に定義されているパラメータの数を表す整数を返します。このプロパティは関数の外にあるステートメントでも調べられるので、関数に渡すパラメータ値を準備する場合などに使用できます。length プロパティと同じ値を返します。

 
var paramCount = myFunction.arity;
 

整数値

 
callerNN 3 IE 4 ECMA なし

読み取り専用

現在の関数を呼び出したステートメントを含む関数オブジェクトへの参照を返します。このプロパティは、参照する関数オブジェクトを呼び出した関数内のスクリプトステートメントだけで読み取ることができます。Netscape 6.0 で省略されましたが、その後のバージョンではあらためて採用されました。

 
function myFunc()
    if (myFunc.caller == someFuncZ) {
        // process when this function is called by someFuncZ
    }
}
 

Function オブジェクト。

 
constructorNN 4 IE 4 ECMA 1

読み書き

Function オブジェクトのインスタンスを作成した関数、つまりブラウザでのネイティブな Function() コンストラクタ関数への参照です。

 
if (myVar.constructor == Function) {
    // process native function
}
 

関数オブジェクトの参照

 
lengthNN 4 IE 4 ECMA 1

読み取り専用

関数で定義されているパラメータの数を表す整数を返します。このプロパティは関数の外にあるステートメントでも調べられるので、関数に渡すパラメータ値を準備する場合などに使用できます。

 
var paramCount = myFunction.length;
 

整数値

 
prototypeNN 3 IE 4 ECMA 1

読み書き

静的な Function オブジェクトのプロパティです。prototype プロパティを使って、現在のドキュメントでこの後作成される関数のインスタンスに新しいプロパティやメソッドを割り当てます。使用例は Array.prototype プロパティを参照してください。

 
Function.prototype.author = "DG";
 

関数参照を含むすべてのデータ

 
apply()NN 6 IE 5.5 (Win) ECMA 3

apply([thisObjectRef[, argumentsArray]])

現在の関数を呼び出します。関数内の任意の this 参照のコンテキストとして使用するオブジェクトを指定することもできます。関数へのパラメータがある場合は、apply() メソッドの 2 番目のパラメータとして配列で渡します。このメソッドは、アノニマス関数または名前付き関数に使用できます。このメソッドを使用する必要はほとんどありませんが、スクリプトで関数への参照が見つかり、その関数をオブジェクトのコンテキスト内で呼び出す必要がある場合に便利です。

 

カスタムオブジェクトのメソッドとして割り当てられた次のスクリプト関数があるとします。

 
// function definition
function myFunc(parm1, parm2, parm3) {
    // statements
}
// custom object constructor
function customObj(arg1, arg2) {
    this.property1 = arg1;
    this.property2 = arg2;
    this.method1 = myFunc;
}
var myObjA = new CustomObj(val1, val2);
var myObjB = new CustomObj(val3, val4);
 

myFunc() 関数は、基本的にほとんどの場合、次のようにオブジェクトのメソッドとして実行します。

 
myObjA.method1(parmValue);
 

ただし、次のように、関数への参照から関数を呼び出し、オブジェクトから呼び出されたように関数に認識させることもできます。

 
myFunc.apply(myObjB, [parmVal1, parmVal2, parmVal3]);
 

関数 (この例では myFunc) に、this キーワードを含むステートメントがある場合、そのキーワードが、apply() メソッドの最初のパラメータとして渡されるオブジェクトコンテキストへの参照になります (この例では myObjB)。

 
戻り値

なし

 
パラメータ
 
  • thisObjectRef
      この関数のコンテキストとして機能するオブジェクトへの参照
  • argumentsArray
      関数に渡す値を要素とする配列。配列のエントリは、配列内での順序で関数に渡されます。
 
call()NN 6 IE 5.5 (Win) ECMA 3

call([thisObjectRef[, arg1[, arg2,[...argN]]]])

現在の関数を呼び出します。関数内の任意の this 参照のコンテキストとして使用するオブジェクトを指定することもできます。関数へのパラメータがある場合は、call() メソッドの追加パラメータとしてコンマ区切りリストで渡します。call() メソッドと apply() メソッドは、関数へのパラメータを構成する方法が異なるだけで、行われる処理は同じです。詳細については、apply() メソッドを参照してください。

 
戻り値

なし

 
パラメータ
 
  • thisObjectRef
      この関数のコンテキストとして機能するオブジェクトへの参照
  • arg1、...argN
      関数に渡すパラメータ値のコンマ区切りリスト
 
toString()NN 4 IE 4 ECMA 1

オブジェクトの値 (スクリプトステートメントにおける定義と関数ラッパー) を、文字列として返します。実際には、警告ダイアログボックスやドキュメント内に表示される値は、ブラウザが必要に応じて文字列に変換するため、このメソッドは必要ありません。

 
戻り値

文字列

 
パラメータ

なし

 
valueOf()NN 4 IE 4 ECMA 1

オブジェクトの値を返します。警告ダイアログボックスなどに値を表示するとき、ブラウザでは値が文字列に変換されますが、実際の値は Function オブジェクトのインスタンスです。

 
戻り値

関数オブジェクト参照

 
パラメータ

なし