非StrictとStrictモードでは、関数にthisとして渡した値が
オートボクシングされる / されない
という違いがあります。
以下では、それぞれのモードでthisの振る舞いについて比較しています。
目次
非Strictモードでのthisの振る舞い
非Strictモードの場合、関数にthisとして渡された値は、オブジェクトにオートボクシングされます。
厳密には、undefined や null はグローバルオブジェクト(Windowオブジェクト)に、プリミティブ型の値は、オブジェクトに変換されます。
例えば、次のような this を返すだけの関数がある場合
1 2 3 |
function hoge() { return this; } |
この関数にthisとして渡された値は、次のようにオートボクシングされて返されます。
1 2 3 4 5 6 |
console.log(hoge()); // return Window console.log(hoge.apply(null)); // return Window console.log(hoge.call(undefined)); // return Window console.log(hoge.call(100)); // return Number console.log(hoge.call("100")); // return String console.log(hoge.bind(true)()); // return Boolean |
Strictモードでのthisの振る舞い
Strictモードでは、関数にthisとして渡された値は、オートボクシングされず、そのままの値が渡されます。
先ほどの関数をStrictモードで呼び出すと次のようになります。
1 2 3 4 5 6 |
console.log(hoge()); // return undefined console.log(hoge.apply(null)); // return null console.log(hoge.call(undefined)); // return undefined console.log(hoge.call(100)); // return 100 console.log(hoge.call("100")); // return 100 console.log(hoge.bind(true)()); // return true |
まとめ
非StrictモードとStrictモードでは、thisの振る舞いが大きく違うため、非Strictモード から Strictモード への変更(逆も)注意が必要です。
モードを変更する場合は、thisを使用している箇所を十分に洗い出してから変更しないと思わぬ不具合になるかもしれません。