在JS中定义函数两次。根据网页指出要使用的定义

时间:2013-07-25 05:36:36

标签: javascript

我有两个网页。它们共享相同的.js文件,但该文件包含我只想为一个或另一个页面执行的代码。

我认为我可以像下面一样处理它,其中每个页面都有一个具有唯一ID的元素,“page_1”或“page_2”。然后,js在执行代码之前测试该元素是否存在。

但是,在page_1上,尽管它实际上并没有执行page_2 IF语句中的代码,但函数runStartFunction()仍然被覆盖,因为它被定义了两次。

我该如何避免这种情况?显然我可以给所有函数赋予不同的名称,但是我有很多页面,我可能会在某些时候意外地使用相同的名称。

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();

3 个答案:

答案 0 :(得分:3)

在JavaScript中,函数声明为hoisted。您的代码变为:

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();

runStartFunction的第二个声明会覆盖第一个声明,因此第二声明称为。{/ p>

您可以使用函数表达式和赋值而不是声明来解决此问题,如下所示:

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

答案 1 :(得分:0)

就像我在评论中所述,我认为这不是一个好主意,但我仍会为您提供解决问题的方法:使用closures

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

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

runStartFunction();

答案 2 :(得分:0)

基于ManuelGörlich的回答,以下是我最终如何做到这一点。我将每个代码集包围在一个闭包中,然后我将其他所有内容保留原样。对runStartFunction()的调用必须在每个闭包内。

if (document.getElementById("page_1") != null){(function () { 

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

}());}

if (document.getElementById("page_2") != null){(function () { 


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

}());}