キミョい現象
iOS 9.3.2 の Safari では,ES5 の strict modeの場合,特定の条件下で Object.defineProperty()
をコールすると,JavaScript が実行されず何もエラーや exception も吐かないという奇妙な現象に出会しました.
その特定の条件とは,わりと限定的ですが,Object.defineProperty()
で設定する property に setter として名前付き関数を設定し,その関数名と引数名を同じにした場合です.
なお strict mode を解除すると,Safari でも期待通りの結果になります.Chrome や Firefox,そして Node.js では strict mode でもこの現象は発生しません.
実証コード
gist でも公開していますが,次のようなコードで確認できます.
このコードは,setter/getter をObject.defineProperty()
で設定する方法を解説した次のサイトにある参考情報を元にしています.
https://robertnyman.com/javascript/javascript-getters-setters.html#object-defineproperty
'use strict';
var lost = {
loc : "Island"
};
Object.defineProperty(lost, "location", {
get : function location() {
return this.loc;
},
set : function location(location) {
this.loc = location;
}
});
// call getter
console.log(lost.location);
// => Island
// call setter
lost.location = "Another island";
console.log(lost.location);
// => Another island
このコードを実行すると iOS 9.3.2 の Safari では,この strict mode のスコープにある JavaScript の実行がエラーを吐いて停止したような状況になりますが,try-catch ではエラーや exception をひろえません.
なので調査はここまでに留めています.
Safari の strict mode に対する生温い不信感
Safari の strict mode でのキミョい挙動は 別の件 でも報告されていて,今回の現象と合わせて,Safari の strict mode に生温い不信感をもちました.
そして,原因不明のバグに悩まされた場合は strict mode を疑ってみることも覚えました.