eval(uneval(function()_))
function f(){let _,{x}=0} uneval(f); //=> function f() {var _, var {x} = 0;} eval(uneval(f)); //=> SyntaxError: missing variable name
というバグに出くわした。トップレベルなので var
に変わるのはいいとして,問題は変に増えて構文エラーになるところ。
気になって該当バグを探し当てたら,「Blocks:」に指定されてる Bug 349611 – Jesse's JavaScript compiler/decompiler fuzzer に行き着いた。「Depends on:」が壮観で,
javascript:Array.forEach(document.getElementsByClassName('bz_closed'),function(_){_.style.display='none'})
解決済みを消しても相当数残る。
375641 - Function decompilation throws away high bytes of characters in regexp literals などもあり,Function#toString()
を信用してはいけない。
よくある
location = 'javascript:0,'+ function(){ ... } +'()';
みたいなのは
location = <![CDATA[javascript:0,function(){ ... }()]]>;
とでもするのが無難。