2010-08-29 25 views
1

前一段时间,我问了一个关于同一问题的问题,@BenAlabaster彻底地解释了它in his answer,我想我仍然在这里错过了一段逻辑。调用分配给变量的JS函数

我试着在最后一个函数中调用分配给变量的函数,如下所示。 那么它没有工作。假设它发生是因为变量functionThree不在addOnload()函数之外,我试图将其移入内部,并且浏览器刚刚崩溃。

addOnload(functionOne); 
addOnload(functionTwo); 
addOnload(functionThree); 

function addOnload(newFunction){ 
    oldOnload = window.onload; 

    if(typeof oldOnload == "function"){ 
     window.onload = function(){ 
      if(oldOnload){ 
       oldOnload(); 
      } 
       newFunction(); //This is what I missed, and that's what caused the crash. 
     } 
    } 
    else{ 
     window.onload = newFunction; 
    } 
} 

function functionOne(){ 
    alert("This is the first function on this page!"); 
} 

function functionTwo(){ 
    alert("This is the second function on this page!"); 
} 

functionThree = function(){ 
    alert("This is the third function on this page!"); 
} 
+0

像@Tomalak下面说,我在'addOnload'函数内移动' functionThree = function()'来声明变量。由于我犯了一个错误,浏览器被吊死了。 – Dean 2010-08-29 21:25:46

+1

另请参阅[函数表达式与函数声明](http://yura.thinkweb2.com/named-function-expressions/#expr-vs-decl) – 2010-08-29 21:41:45

回答

3

发生这种情况是因为在定义之前使用functionThree

function x() { 
    // a function that can be used before its declaring block 
} 

x = function() { 
    // a variable that gets assigned a function object when the execution 
    // of the program reaches this point, but not before 
} 

除此之外,您的addOnload()实施应该是这样的:

function addOnload(newFunction){ 
    if (typeof window.onloadFunctions === "undefined") { 
    window.onloadFunctions = []; 
    window.onloadFunctions.push(window.onload); 

    window.onload = function() { 
     for(var i=0; i<window.onloadFunctions.length; i++) { 
     var f = window.onloadFunctions[i]; 
     if (typeof f === "function") f(); 
     } 
    } 
    } 
    window.onloadFunctions.push(newFunction); 
} 
+0

我刚刚将声明移入其中,它的工作原理。 由于我提出了一个不同的错误,浏览器手。 – Dean 2010-08-29 21:22:23

+0

我也会检查你的,但是我发布的那个工作正常+很短。 – Dean 2010-08-29 22:03:35

3

没有您addOnloadFunction一个轻微的问题:它应该是:

function addOnload(newFunction){ 
    var oldOnload = window.onload; 

    if(typeof oldOnload == "function"){ 
     window.onload = function(){ 
      newFunction(); 
      oldOnload(); 
     } 
    } 
    else{ 
     window.onload = newFunction; 
    } 
} 
+0

我编辑并添加了修复程序,但thanx。 – Dean 2010-08-29 21:29:22

+0

你的版本仍然缺少声明oldOnload作为局部变量的“var”关键字 – 2010-08-30 00:22:27