Ael.lang.Function

説明

ネイティブ組み込みオブジェクトの一つであるFunctionオブジェクトを対象とした機能を提供します。

aelプロパティ

call

ael call(Array args[, object scope]) : any
  • @version 0.2
  • @param {Array} args 引数
  • @param {object} [scope] 関数実行時のスコープ(デフォルト:グローバルオブジェクト)
  • @return {any} 関数の戻り値

Aelオブジェクトが持つ関数を呼び出す。
Function.prototype.applyが存在する場合はそれを用いて関数を呼び出す。存在しない場合は第2引数のオブジェクトに一時プロパティを作成し、そこに関数を設定して呼び出す。呼び出し後には一時プロパティを削除する。

chain

ael chain(object|function fn) : function
  • @version 0.2
  • @param {object|function} fn 関数
  • @return {function} 繋げた後の関数

引数の関数をAelオブジェクトが持つ関数のプロトタイプチェーンに繋げる。
プロトタイプチェーンは末端に関数以外を繋げる事ができる為、引数は関数型以外も許容する。また、チェーンを繋げた後はconstructorプロパティにAelオブジェクトが持つ関数を設定する。これはprototype.constructorが未定義値の場合、チェーン先のconstructorプロパティを参照してしまう事を防ぐ為です。なお、Netscape系ブラウザ(NN、Mozilla、Firefoxなど)は他のブラウザとプロトタイプチェインの繋げ方が違うが、このメソッドは違いを吸収する。

clear

ael clear() : void
  • @version 0.4

引数の関数が持つprototype以外のプロパティを削除する。
なお削除対象のプロパティはfor..inにより取得するためDontEnum属性がついているプロパティ(valueOfなど)は対象外となる。

curry

ael curry([Array args[, object scope]]) : function
  • @version 0.2
  • @param {Array} [args] 固定化する引数 (デフォルト:[])
  • @param {object} [scope] スコープ (デフォルト:{})
  • @return {function} カリー化後の関数

指定した引数でAelオブジェクトが持つ関数をカリー化した関数を生成して返す。
固定化する複数の引数は第1引数に配列形式で指定する。固定化は先頭から行われる。固定化されなかった引数はカリー化後の関数の引数で指定する。また、関数を実行するスコープも指定する事ができる。未指定の場合は空のオブジェクトとなる。

defer

ael defer([object option]) : number
  • @version 0.3
  • @param {object} option オプション
  • @return {number} 識別値

引数で指定した遅延時間を経過後にAelオブジェクトが持つ関数を呼び出す。
このメソッドはwindow.setInterval()をラップし、次のオプションを指定することで多様な遅延処理を可能にしたものです。

項目名初期値説明
msnumber50遅延時間。(単位:ミリ秒)
intervalbooleanfalse一定間隔毎の実行を指示するフラグ。true を指定した場合は遅延時間毎に繰り返し実行される。false を指定した場合は一度だけ実行される。このフラグは実行条件の後に評価される。
argumentsArray[]関数呼び出し時に渡す引数。
scopeobjectGlobalオブジェクト関数呼び出し時のスコープ。
originalbooleanfalseライブラリ読み込み時のwindow.setIntervalプロパティ値で遅延処理を登録する場合はtrueを指定。
conditionfunctionundefined実行条件を含む真偽値を返す関数。条件は遅延時間を経過後に評価する。結果が true の場合はAelオブジェクトが持つ関数が呼び出される。結果が false の場合は再度同じ遅延時間を経過後に再評価する。

intervalオプションに true を指定した場合、戻り値の識別値をwindow.clearInterval()へ渡すことで遅延処理を停止できる。

var count = 0;
var id = Ael(function(){
    var a = arguments;
    alert(this.a + a[0] + a[1] + a[2]);		// スコープのプロパティと引数を表示(「a123」と表示される)
    window.clearInterval(id);		// 遅延処理を停止する
}).defer({
    ms : 1000,
    arguments : [1,2,3],
    scope : {a:"a"},
    interval : true,
    condition : function(){			// 3回目以降の遅延処理から実行する条件を指定
        count++;
        return count > 2;
    }
});

interceptor

ael interceptor(object advices) : function
  • @version 0.3
  • @param {object} advices アドバイス
  • @return {function} インタセプター関数

Aelオブジェクトが持つ関数を内包したインタセプター関数を生成して返す。
インタセプター関数はAspectのbefore、around、afterアドバイスを単一の関数に対して独自の仕様で実現する。インタセプター関数を呼び出すと内包した関数を同じ引数とスコープで呼び出される。従って内包した関数はインタセプター関数が存在しないかのように認識する。
またアドバイスの設定はインタセプター関数のbefore、around、afterプロパティに関数を設定することで行う。beforeプロパティに関数を設定すると、内包した関数を呼び出す前にbeforeプロパティに設定した関数を呼び出す。aroundプロパティに関数を設定した場合は内包した関数に置き換えて呼び出す。afterプロパティに関数を設定した場合は内包した関数(またはaroundプロパティの関数)を呼び出し後に呼び出す。
以下に各アドバイスを設定して実行する例を示す。

// 内包する関数を定義
var fn = function(string){
    alert("fn: " + string);
};
// インタセプター関数を生成し、各アドバイスを設定。アドバイスはインタセプター関数生成後、
// 「interceptor.before = function(){...}」のように設定することもできる。
var interceptor = Ael(fn).interceptor({
    before: function(string){
        alert("before: " + string);
        this.x = 0;
    },
    around: function(string){
        alert("around: " + string);
        this.proceed(arguments);
        this.x++;
    },
    after: function(string){
        alert("after: " + string);
        alert("x: " + this.x);
    }
});

// インタセプター関数を呼び出す
interceptor("aiueo");

上記コードを実行すると次の順で文字列が表示される。

before: aiueo
around: aiueo
fn: aiueo
after: aiueo
x: 1

各アドバイスは内包した関数と違う特殊なスコープオブジェクトで呼び出される。このスコープオブジェクトには次のプロパティが定義されている。

  • fn : 内包した関数
  • proceed : 内包した関数をインタセプター関数と同じスコープで呼び出すメソッド
  • scope : インタセプター関数のスコープオブジェクト

aroundアドバイスを指定すると内包した関数を呼び出さないが、必要な場合はproceedメソッドで呼び出すことができる。このスコープオブジェクトはインタセプター関数の呼び出し時に生成され、呼び出しを終えた時点で破棄される。従って各アドバイス間の値のやり取りはスコープオブジェクトにプロパティを設定することでできる。

name

ael name() : string
  • @deprecated
  • @version 0.2
  • @return {string} 関数名(無名関数は""、または"anonymous"を返す)

Aelオブジェクトが持つ関数の文字列表現から関数名を抜き出して返す。
無名関数は""(空文字列)または"anonymous"を返す。

timer

ael timer([object options]) : number
  • @version 0.4
  • @param {object} [option] オプション
  • @return {number} タスクId

Aelオブジェクトが持つ関数をタスクとしてタイマーに登録する。
引数のオプションにはdeferと同じ項目を指定することができる。timerとdeferの違いはdeferはタスクを登録する度にタイマーを生成するのに対して、timerは最初に一つのタイマーで全てのタスクをスケジューリング・実行する点です。Operaなどはタイマーの処理コストが高いため一つのタイマーで実行することでパフォーマンスを向上できます。

try_

ael try_(function fn[, object option]) : number
  • @version 0.4
  • @param {number} fn catch関数
  • @param {object} [option] オプション
  • @return {number} 識別値

Aelオブジェクトが持つ関数を非同期で呼び出し、エラーが投げられた場合は引数のcatch関数を呼び出す。
このメソッドはtry-catch句が実装されていない古いJavaScript実装での動作を目的とした代替実装で、非同期という条件付きでtry-catch句に近い機能を提供する。引数のcatch関数にはAelオブジェクトが持つ関数でエラーが投げられた際に実行したい処理を指定する。オプションにはdeferメソッドと同じオプションを指定することができる。

Ael(function(){
    window.aiueo.aiueo;		// 強制的にReferenceErrorを起こす
}).try_(function(e){
    var error = "name : " + e.name + "\n"
            + "line : " + e.line + "\n"
            + "message : " + e.message + "\n"
            + "stack : " + e.stack + "\n"
            + "url : " + e.url + "\n";
    alert(error);			// エラー情報を表示
}, {
    ms : 3000				// 3秒後にtry-catchを実行
});

catch関数に渡される引数はcatch句と同様に、第一引数にエラー情報を含むオブジェクト(Ael.lang.Error型)が設定されている。オブジェクトには次のプロパティが設定されている。

プロパティ名初期値説明
namestring"Error"エラー名。e.nameと同じ。"SyntaxError"や"TypeError"などが設定される。
linenumber-1エラーが起こった行番号。Firefoxのe.lineNumberやSafariのe.lineと同じ。
messagestring""エラー内容。e.messageと同じ。
stackstring""スタックトレース。Firefoxのe.stackと同じ。
urlstring""エラーが起こったソースのURL。Firefoxのe.fileNameやSafariのe.sourceURLと同じ。