0

2 つの Web ページがあります。それらは同じ .js ファイルを共有しますが、ファイルには、どちらか一方のページに対してのみ実行したいコードが含まれています。

各ページには、「page_1」または「page_2」のいずれかの一意の ID を持つ要素がある、以下のように処理できると思いました。js は、コードを実行する前に、この要素の存在をテストします。

ただし、page_1 では、page_2 IF ステートメント内のコードを実際には実行しませんが、関数 runStartFunction() は 2 回定義されているため、オーバーライドされます。

どうすればこれを回避できますか? もちろん、すべての関数に異なる名前を付けることができますが、多くのページがあり、ある時点で誤って同じ名前を使用する可能性があります。

if (document.getElementById("page_1") != null){
    alert("Page 1"); // executed, as expected
    function runStartFunction(){
        alert("what I want"); // not executed, but should be
    }
}

 if (document.getElementById("page_2") != null){
   alert("Page 2"); // not executed, as expected
   function runStartFunction(){ 
        alert("what I don't want"); // executed, but shouldn't be
   }
 }

runStartFunction();
4

3 に答える 3

3

JavaScript では、関数宣言は巻き上げられます。コードは次のようになります。

function runStartFunction() {
    alert("what I want");
}

function runStartFunction() { 
    alert("what I don't want");
}

if (document.getElementById("page_1") != null) {
    alert("Page 1");
}

if (document.getElementById("page_2") != null) {
    alert("Page 2");
}

runStartFunction();

の 2 番目の宣言は最初の宣言をrunStartFunctionオーバーライドするため、2 番目の宣言が呼び出されます。

次のように、宣言の代わりに関数式と代入を使用して、この問題を解決できます。

var runStartFunction;

if (document.getElementById("page_1") != null) {
    alert("Page 1");
    runStartFunction = function () {
        alert("what I want");
    };
}

if (document.getElementById("page_2") != null) {
    alert("Page 2");
    runStartFunction = function () { 
        alert("what I don't want");
    };
}

runStartFunction();

フィドル: http://jsfiddle.net/nYPME

于 2013-07-25T05:41:32.763 に答える