1

すでに定義されているかどうかを最初に確認する関数を使用すると、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 エンジンのバグですか、それとも何か見落としているのでしょうか?

4

3 に答える 3

1

一部のブラウザーで機能したのはまぐれであり、あなたが考える理由で機能しませんでした。

関数定義は「ホイスト」されるため、関数が定義されている場所ではなく、スコープ内にあるときに関数を使用できます。

たとえば、これは合法です

a();
function a() {
}

評価では、関数定義が一番上に持ち上げられて

function a() {
}
a();

代わりに、次のようにします。

if(window.foo === undefined) {
    window.foo = function() {
        alert("This is the second function when foo() is undefined.");
    }
}
于 2013-11-03T07:27:02.910 に答える
0

ディレクティブ function name() は、ウィンドウ スコープで関数を宣言していることを意味します。関数を特定の変数にリンクする必要があります。

var myFunc=function(){ alert(1);};
if (true){
  myFunc=function(){alert(2);}
}
if (false){
  myFunc=function(){alert(3);}
}
myFunc();

アラート 2 が発生します。

于 2013-11-03T07:29:17.277 に答える