1

document.ready() に次のコードがあります

if ($("#site-master").length > 0) {

    setMinContentHeight();

    function setMinContentHeight() {

        // removed for clarity
    }
}

ページが正しいかどうかを確認し (#site-master)、最小の高さ関数を呼び出すだけですが、firebug で次のエラーが発生します: ReferenceError: setMinContentHeight が定義されていません。

私は JavaScript の専門家ではありませんが、これはどうしてでしょうか? document.ready() の外に移動すると、関数は機能します。チェックしたところ、if ステートメント内のコードに到達しました。

また、これは私が望むものを達成するための最良の方法ですか?

前もって感謝します。

4

5 に答える 5

10

iforforステートメント内で関数を宣言しないでください。

function setMinContentHeight() {
    // removed for clarity
}

if ($("#site-master").length > 0) {
    setMinContentHeight();
}

ECMAScript 仕様に対処する場合、第 12 章に従って、句はステートメント(および、、、など)とif見なされます。forwhilewithtry/catch

したがって、セマンティクス セクションの注従ってください

広く使用されている ECMAScript の実装のいくつかは、FunctionDeclarationとしてのの使用をサポートすることが知られていStatementます。ただし、そのようなFunctionDeclarationsに適用されるセマンティクスの実装には、重大で相容れないバリエーションがあります。これらの相容れない違いのために、 a を aFunctionDeclarationとして 使用すると、Statement実装間で確実に移植できないコードになります。ECMAScript の実装では、このような使用法を禁止するか、FunctionDeclarationそのような使用法に遭遇したときに警告を発行することをお勧めします。StatementECMAScript の将来の版では、コンテキスト内で関数を宣言するための代替の移植可能な手段が定義される可能性があり ます。

これは、そのような場合に一貫した動作を保証できないことを意味し、その結果、 function がstatementstrict mode内で宣言されている場合は常に例外が発生します。

于 2013-03-22T14:48:53.023 に答える
3
if ($("#site-master").length > 0) {
    setMinContentHeight();
}
function setMinContentHeight() {
        // removed for clarity
}

関数をグローバル スコープで宣言する必要があります。

于 2013-03-22T14:48:19.647 に答える
2

関数を定義した後に呼び出しを行い、if ブロック内で関数を定義しないでください。

function setMinContentHeight() {
    // removed for clarity
}

if ($("#site-master").length > 0) {
    setMinContentHeight();
}
于 2013-03-22T14:48:24.687 に答える