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
オブジェクトを生成しているので効率が悪いように見えますが、
たくさんオブジェクトを生成しなければそんなに問題ないでしょう。
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 が表示されます。
multiply();
function multiply(a, b) {
alert(multiply.length);
return a * b;
}
function test5() { alert(multiply.arity); }
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());
}
正直言ってよく分からないのですが、しかし、JavaScript ごときに継承の機構までいらないと思うんですが。