变量函数未定义错误

时间:2014-05-14 07:23:36

标签: javascript

我在一个功能中有这两个功能。

var funcA = function(){
  var funcB = function(){
    // function codes
    funcC();
  }

  var funcC = function(){
    // function codes
    funcB();
  }
}

首先执行funcA,然后当我调用funcB时,它会产生错误Object [object global] has no method 'funcC'。如果我在funcC之前放置funcB,则错误现在指向undefined funcB

如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

你的问题与你宣布职能的方式有关:

var funcB = function(){
    // function codes
    funcC();
  }

var funcC = function(){
    // function codes
    funcB();
}

当您声明funcB时,它会尝试查找尚不存在的funcC。这会破坏您的代码,导致undefined错误。

您可以定义如下函数:

function funcB(){
    // function codes
    funcC();
  }

function funcC(){
    // function codes
    funcB();
}

但是,如果funcB调用funcCfuncC调用funcB,则无论它们如何声明/初始化,您将拥有无限循环,可能导致堆栈溢出错误,或崩溃的浏览器(/ tab)。

Chrome会抛出这个:

RangeError: Maximum call stack size exceeded

要避免该错误,请执行以下操作:

function funcB(calledFromC){
    if(!calledFromC){
        funcC(true);
    }
}

function funcC(calledFromB){
    if(!calledFromB){
        funcB(true);
    }
}

或更短:

function funcC(calledFromB){
    !calledFromB && funcB(true);
}

答案 1 :(得分:1)

如果您要声明这样的函数:

var funcA = function(){
   function funcB() {
      funcC();
   }

   function funcC {
      funcB();
   }
}

它会起作用。你为什么问?阅读有关提升,范围,函数声明和函数表达式here

的更多信息

检查小提琴here

当然,这将是一个无限循环,所以不要这样做,但这将是正确的JavaScript。

编辑:如果您想要将它们调出范围(在funcA之外),则需要返回它们:

 var funcA = (function() {
    var funcB = function () {
        //code here
    };
    var funcC = function () {
        //code here
    };
    return {
        funcB: funcB,
        funcC: funcC
    };
   })();

现在你可以在funcA之外做到这一点:

funcA.funcB();
funcA.funcC();

答案 2 :(得分:0)

你可能会问错误的问题,因为相互关联的方法很少会愉快地结束。

你问题的答案实际上是因为this earlier answer regarding when functions actually exist。特别是关于功能提升的内容。

var funcA = function() {

  function funcB(){
    // function codes
    funcC();
  }

  function funcC() {
    // function codes
    funcB();
  }
}

funcA.funcB();
相关问题