Skip to content

関数呼び出しの方法

関数を呼び出すための API 呼び出しは、ほとんどが非常に簡単で、ターゲット関数と引数のリストが与えられます。しかし、以下の ECMAScript 固有の詳細が問題を少し複雑にしています。

  • ECMAScript の関数/メソッド呼び出しには "this" バインディングが含まれますが、これは API 呼び出しと ECMAScript の呼び出しイディオムで異なります。もし与えられなければ、"this" バインディングはデフォルトで undefined になります(しかし、ターゲット関数が strict でない限り、グローバルオブジェクトに強制されます;Duktape/C 関数は常に strict です)。

  • コンストラクタの呼び出しは、"this "バインディングとその戻り値に対して特別な動作があります。this」バインディングは「デフォルト・インスタンス」に初期化され、戻り値は特別な処理を行い、デフォルト・インスタンスを置き換えることができるようになります。内部プロトタイプと外部プロトタイプを参照してください。

C APIには、protectedとunprotectedのバリエーションがあります。その違いは、protectedの呼び出しはエラーを捕捉することです。エラーはC API呼び出しの戻り値で示され、エラーオブジェクトは値スタックに配置されます。これにより、例えばエラーのトレースバックを読むことができる。

下の表は、unprotectedコールを例にしてAPIコールをまとめたものです。

ECMAScript idiomDuktape C API idiomThis bindingValue stack
var result = func('foo', 'bar');duk_get_global_string(ctx, "func");
duk_push_string(ctx, "foo");
duk_push_string(ctx, "bar")
duk_call(ctx, 2 /nargs/);
/* result on stack top */
undefined[ func "foo" "bar" ] ->
[ result ]
var result = func.call('myThis', 'foo', 'bar');duk_get_global_string(ctx, "func");
duk_push_string(ctx, "myThis");
duk_push_string(ctx, "foo");
duk_push_string(ctx, "bar")
duk_call_method(ctx, 2 /nargs/);
/* result on stack top */
"myThis"[ func "myThis" "foo" "bar" ] ->
[ result ]
var result = obj.func('foo', 'bar');duk_push_string(ctx, "func");
duk_push_string(ctx, "foo");
duk_push_string(ctx, "bar")
duk_call_prop(ctx, obj_idx, 2 /nargs);
/* result on stack top */
obj[ "func" "foo" "bar" ] ->
[ result ]