JavaScript, Neo-Generation
Written 11/1/99
5. 関数
Function オブジェクト JavaScript 1.1 JScript 3
Function オブジェクトは、もちろん次のように明示的に定義できますが、
    function functionname(arguments list) {
        body
    }
 
new を使ってコードの中で作成することができます。
    var functionname = new Function(arguments list, body);
 
例えば次のように使います。
    var add = new Function("x", "y", "return x + y;");
    alert(add(1, 2));                       // 1 + 2 = 3
 
これは結局次と同じことになります。
    alert(add(1, 2));
    
    function add(x, y) {
        return x + y;
    }
 
ではなぜこんな書き方をするかというと、それはたぶん行数削減のためです。 例えば、次のように Function オブジェクトを引数に使う場合に有効です。
    var ary = new Array(1, 5, 9, 2, 6);
    ary.sort(new Function("a", "b", "return b - a;"));   //降順にソート
    alert(ary.join(" "));
 
こんなソートのためだけにわざわざ明示的に Function オブジェクトを定義することもないでしょう。
あと、ユーザ定義オブジェクトのメソッドの定義にも使えるでしょう。
    function man(age) {
        this.age = age;     //年齢
        //寿命を80年として余命を計算
        this.yomei = new Function("return 80 - this.age;");
    }
 
これだとたぶんユーザ定義オブジェクトの生成のたびに Function オブジェクトを生成しているので効率が悪いように見えますが、 たくさんオブジェクトを生成しなければそんなに問題ないでしょう。
caller プロパティ JScript 3
ドキュメントにはありませんが、NN4.6でも動きます。
caller プロパティはその関数を呼び出している関数への 参照を返します。arguments プロパティと同様に今実行中の関数でなければなりません。
関数の中からでなくトップレベルから呼び出された場合は null が返ります。
次の例はちょっと面白いです。
 function test3() {
    var ary = new Array(1, 5, 9, 2, 6);
    ary.sort(asc);
 }
 
 function asc(a, b) { alert(asc.caller); return b - a; }
 
ネスケでは sort が何度も表示されますが、IE では test3 が表示されます。
length プロパティ JavaScript 1.1 JScript 2

実行中の関数が要求している引数の数を返します。
 multiply();
 
 function multiply(a, b) {
    alert(multiply.length);
    return a * b;
 }
 
arity プロパティ JavaScript 1.2
関数が要求している引数の数を返します。 これはその関数の外部から呼び出します。
 function test5() { alert(multiply.arity); }
 
継承 JavaScript 1.3
call プロパティを使うとクラスの継承のようなことができます。
 function person(name, age) {
    this.name = name;
    this.age = age;
    this.yomei = new Function("return 80 - this.age;");
 }
 
 function student(name, age, club) {
    this.club = club;
    person.call(this, name, age);
 }
 
 function test6() {
    //次の行はネスケのリファレンスの例に従ったまで
    //無くてもちゃんと動く
    student.prototype = new person();
    
    var sakura = new student("さくら", 9, "cheerleading");
    alert(sakura.yomei());
 }
 
正直言ってよく分からないのですが、
まず person というクラスがあって、 student クラスの中で person という Function オブジェクトの call メソッドを呼ぶことによって、 student クラスで name プロパティと age プロパティが person クラスと同様に使えるようになります。 そうすると yomei メソッドも自動的に使えるようになります。
以上のように person クラスから student クラスへ 継承のようなことが行われます。

しかし、JavaScript ごときに継承の機構までいらないと思うんですが。

Back