Nicholas C. Zakas is a web software engineer who specializes in user interface design and implementation for web applications using JavaScript, Dynamic HTML, CSS, XML, and XSLT. |
Mysterious arguments object assignments - NCZOnlineにおいてJavaScriptの仕様の解釈の違いによるブラウザごとの挙動の違いが紹介されている。Nicholas C. Zakas氏は当初この挙動をFirefox JavaScript実装のバグだと考えて問題報告をしたが、Firefox、IE、Safariで同じ動作をし、さらに開発者からは仕様の要求している挙動を実装したものだという説明があったという。ただし、Chromeはそれらブラウザとは別の挙動を見せる。
まずNicholas C. Zakas氏は次のJavaScriptコードを紹介。Firefox、IE、SafariはNaNを返すが、Chromeは10を返すという。これはChromeではarguments[1] = 10;のアサインがnum2に対しても適用されるが、それ以外のブラウザではそれが適用されないことに起因している。
function doAdd(num1, num2) {
if(arguments.length == 1) {
arguments[1] = 10;
}
alert(arguments[0] + num2);
}
doAdd(10);
arguments配列におけるアサインは関数の引数へのアサインとして動作するが、arguments[1] = 10;ではこの結果がChromeとそれ以外のブラウザで異なっている。これはChromeが関数定義における引数の個数をチェックしてarguments[0]とarguments[1]という2つに対して適用するのに対して、FirefoxやIE、Safariでは関数コール時における引数の個数をチェックして上記の例ではarguments[0]に対してのみnum1へのアサインが適用されることに理由がある。たとえば次のように実行すると、値はどのブラウザでも20になる。
function doAdd(num1, num2) {
arguments[1] = 10;
alert(arguments[0] + num2);
}
doAdd(10, 25); //20
仕様を理解するというのは実装するというよりも難しい行為という側面をもっている。こうした問題点に焦点を当てることで、実際にどういった動作がおこなわれているのか理解できるようになるという。Nicholas C. Zakas氏は、たしかにこうした問題に遭遇して痛い目をみることもあるが、それでもほかの方法を模索することで得るものはあると説明している。