JavaScriptCoreで実行するスクリプトにおけるthisの扱いがわからない

投稿者: Anonymous

お世話になっております。

仕事でiOSのJavaScriptCoreを使っているのですが、以下のようなスクリプトを走らせた際に意図した挙動になりません。

// JSコンテキストを作成
JSContext context = new JSContext();
// スクリプトの実行
context.EvaluateScript("var hoge = { position:[0,0,0], update: function() { this.position[0] += 1; } };");
// hogeオブジェクトの取り出し
JSValue hoge = context[(NSString)"hoge"];
// hoge.positionを出力
Console.WriteLine(hoge[(NSString)"position"].ToString());
// hoge.updateの呼び出し
hoge.GetProperty("update").Call();
// 変更後のhoge.positionの出力
Console.WriteLine(hoge[(NSString)"position"].ToString());

期待している出力結果は、

[0,0,0]
[1,0,0]

なのですが、実際は

[0,0,0]
[0,0,0]

のように何も変更されていません。

updateの呼び出し方はJSValue.Call(JSValue[]) Methodを参考にしました。

気になってupdateの中身をreturn this.position;に書き換えると結果はundefined
さらに書き換えてreturn this;とするとグローバルオブジェクトが返ってきました。

JavaScriptでメソッド呼び出す場合、thisにはメソッドを持っているオブジェクトが入るはずですよね?

メソッド呼び出しの仕方が間違えているのかもしれません。
原因を知りたいです。

解決

これを書きながら並行して調べてたらJSValueクラスにはどうやらInvokeメソッドなるものが存在した…。

JSValue.Invoke(String, JSValue[]) Method

これを以下のように使うと、

hoge.Invoke("update");

次のように期待した結果が出ました!!

[0,0,0]
[1,0,0]

メソッド内でthisを使う場合は呼び方に気をつけないといけないですね。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *