变量函数未定义错误

variable function undefined error

本文关键字:错误 未定义 函数 变量      更新时间:2023-09-26

我有这两个函数,在一个函数中

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

如何解决这个问题?

你的问题在于你声明函数的方式:

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调用funcC, funcC调用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);
}

如果你想这样声明函数:

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

可以。你为什么这么问?在这里阅读更多关于提升、作用域、函数声明和函数表达式的内容

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

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

你的问题的答案确实是因为前面关于函数实际存在的答案。特别是阅读函数提升。

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