すでに定義されているかどうかを最初に確認する関数を使用すると、Webkit ブラウザーで問題が発生します。ときどき、js モジュール A の関数を使用し、別のアプリケーションでモジュール B の同じ名前 (ただしコードはわずかに異なる) の同じ関数を使用したいことがあります。これを typeof 演算子で解決し、「未定義」かどうかを確認します。次の例 (わかりやすくするためにすべて 1 つのファイルにまとめたもの) は、私が何をしているかを示しています。
<!DOCTYPE html>
<html>
<head>
<title>Javascript function definition test</title>
<script type="text/javascript">
// actually in module A.js
function foo()
{
alert("This is the first function.");
}
// actually in module B.js
if (typeof(foo)=="undefined") {
function foo()
{
alert("This is the second function when foo() is undefined.");
}
}
// This definition SHOULD be ignored in all cases but Webkit does run this despite the if (false) !!
if (false) {
function foo()
{
alert("This is the third function when foo() is defined within if (false).");
}
}
</script>
</head>
<body>
<script type="text/javascript">
foo();
</script>
</body>
</html>
Chrome (Android および OSX)、Boat Browser (Android)、Safari (OSX) では、if (false) 条件の間で無効になっているにもかかわらず、最後に定義された関数が常に呼び出されることを発見しました。これを削除すると、関数が以前に定義されているにもかかわらず、typeof "undefined" の間の 2 番目の定義が呼び出されます。
Firefox (OSX、Android) では、最初の関数を正しく呼び出します。
これは Webkit エンジンのバグですか、それとも何か見落としているのでしょうか?