サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Flash非公式テクニカルノート

Function.lengthプロパティ

ID: FN1210003 Platform: All Version: CS6/ActionScript 3.0 Runtime: Flash Player 9/AIR 1.0

Functionクラス
パッケージ トップレベル
継承 Function → Object
lengthプロパティ
文法 length:uint
プロパティ値 [読取り専用] 関数の定義に宣言された引数の数を示す。
実装 public function get length():uint

説明

Function.lengthプロパティ[*1]は、関数の定義に宣言された引数の数を返します。Functionインスタンスがつくられると、関数定義に宣言された引数の数が整数でFunction.lengthプロパティに与えられます。プロパティ値は読取り専用ですので、値は変えられません。

arguments.lengthプロパティが、呼出した関数の中(ローカルスコープ)で、実際に受取った引数の数を返すのとは異なります。なお、...(rest)パラメータ定義キーワードで定めた引数は、Function.lengthプロパティの示す引数の数には含まれません。

[*1] Function.lengthプロパティは、ドキュメントには掲載されていません。その意味では、非ドキュメントのプロパティです。けれど、「ECMAScript 1st Edition」に定められており(Mozilla Developer Network「Function.length」)、Flash Player 9から備わっています。また、コードヒントにも含まれていることから考えて、公開されていないというより、掲載漏れの可能性が高いように思われます。

図001■Functionオブジェクトに示されるコードヒント
図001


Function.lengthプロパティがStarlingフレームワーク1.2で使われている例をふたつご紹介します。

まず、Starlingクラスです。Flash Player 11.4とAIR 3.4が公開され、「Stage3D Constrained Profile」が備わりました。Stage3Dコンテンツがハードウェアアクセラレーションのモードで動くデスクトップGPUとハードウェアの範囲を拡げられます(「Webアプリケーションの開発に最先端の技術を採入れる ー Flash Player 11.4およびAIR 3.4」02「StageVideoとStage3Dの機能追加」参照)。

Stage3D Constrained Profileは、Stage3D.requestContext3D()メソッドに新たに加えられた第2引数で定めます。デフォルト値はこれまでのバージョンとの互換を保つため、Baselineプロファイル("baseline")とされています。ところが、Starlingフレームワーク1.2では、これまでのコードを書替えることなく、より多くのPCでStage3Dのハードウェアアクセラレーションが使えるように、Constrainedプロファイル("baselineConstrained")をデフォルトにしました(F-site「Starlingフレームワーク1.2が公開される」の「Constrainedモード」参照)。

そのため、Starling()コンストラクタからStage3D.requestContext3D()メソッドを呼出すとき、Flash Player 11.4以降なら第2引数に"baselineConstrained"を加えます。けれど、それより前のFlash Playerでは、メソッドにふたつ引数を渡せばエラーが起こります。そこで、Starlingクラスの実装は、Flash Playerのバージョンを調べることなく、Function.lengthプロパティの値で与える引数の数を切り分けています。

private var mStage3D:Stage3D;
// ...[中略]...
public function Starling(rootClass:Class, stage:flash.display.Stage, viewPort:Rectangle=null, stage3D:Stage3D=null, renderMode:String="auto", profile:String="baselineConstrained") {
  // ...[中略]...
  mStage3D = stage3D;
  // ...[中略]...
  var requestContext3D:Function = mStage3D.requestContext3D;
  if (requestContext3D.length == 1) requestContext3D(renderMode);
  else requestContext3D(renderMode, profile);
  // ...[中略]...
}

つぎに、EventDispatcherクラスがあります。Starlingフレームワークのイベントリスナーは、定義済みActionScript 3.0とは異なり、イベントオブジェクトを受取る引数は省くことができます(「StarlingフレームワークのEventDispatcher.dispatchEventWith()メソッドと新しいイベント配信」参照)。

EventDispatcher.dispatchEvent()メソッドが内部的(private)に呼出すメソッドinvokeEvent()は、つぎのようにリスナー(listener)の引数の数を予めFunction.lengthプロパティで調べ(numArgs)、値が0のときはイベントオブジェクトは渡さずにリスナーを呼出すからです。なお、リスナーには第1引数のイベントオブジェクトに加え、Event.dataプロパティに加えた値を第2引数(event.data)として送ることもできます。

internal function invokeEvent(event:Event):Boolean {
  var listeners:Vector. = mEventListeners ?
    mEventListeners[event.type] as Vector. : null;
  var numListeners:int = listeners == null ? 0 : listeners.length;
  // ...[中略]...
  for (var i:int = 0; i < numListeners; ++i) {
    var listener:Function = listeners[i] as Function;
    var numArgs:int = listener.length;
    // ...[中略]...
    if (numArgs == 0) listener();
    else if (numArgs == 1) listener(event);
    else listener(event, event.data);
    // ...[中略]...
  }
  // ...[中略]...
}


参考

Mozilla Developer Network「Function.length


作成者: 野中文雄
更新日: 2013年1月16日 Starling 1.3の更新にもとづき、メソッドinvoke()をinvokeEvent()に修正。
更新日: 2013年1月10日 例にふたつ目のEventDispatcherクラスを追加。
作成日: 2012年10月10日


Copyright © 2001-2013 Fumio Nonaka.  All rights reserved.