我有两个网页。它们共享相同的.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();
答案 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();
答案 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();
}());}