Javascript 变量函数未定义错误

Javascript 变量函数未定义错误,javascript,Javascript,我有两个函数,在一个函数中 var funcA = function(){ var funcB = function(){ // function codes funcC(); } var funcC = function(){ // function codes funcB(); } } 首先执行funcA,然后当我调用funcB时,它会产生错误Object[Object global]没有方法“funcC”。如果我将funcC放在funcB

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

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

  var funcC = function(){
    // function codes
    funcB();
  }
}
首先执行funcA,然后当我调用funcB时,它会产生错误
Object[Object global]没有方法“funcC”
。如果我将
funcC
放在
funcB
前面,则错误现在指向
未定义的funcB


如何解决此问题?

您可能问了错误的问题,因为相互关联的方法很少能圆满结束

你的问题的答案确实是因为。特别是阅读有关功能提升的内容

var funcA = function() {

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

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

funcA.funcB();

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

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

var funcC = function(){
    // function codes
    funcB();
}
当您声明
funcB
时,它会尝试查找尚不存在的
funcC
。这会中断您的代码,引发
未定义的
错误

您可以这样定义函数:

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

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

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

   function funcC {
      funcB();
   }
}
但是,如果
funcB
调用
funcC
,并且
funcC
调用
funcB
,无论它们是如何声明/初始化的,都会有一个无限循环,可能会导致堆栈溢出之类的错误,或者浏览器(/tab)崩溃

Chrome抛出了以下内容:

RangeError:超出最大调用堆栈大小
要避免该错误,请执行以下操作:

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

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

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

   function funcC {
      funcB();
   }
}
或更短:

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

如果要声明如下函数:

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

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

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

   function funcC {
      funcB();
   }
}
这会奏效的。你为什么问?阅读有关提升、作用域、函数声明和函数表达式的更多信息

检查小提琴

当然,这将是一个无限循环,所以不要这样做,但这将是正确的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();

在funcB()中调用funCC(),反之亦然。它不会产生无限循环吗?您的示例有几个问题,很难看出实际问题是什么。首先,如果执行funcA,将无法执行funcB和funcC,因为它们将隐藏在funcA的范围内。第二,如果你调用funcB或functHanks@malkam来指向我,你会导致一个无限递归循环,我试图做的是调用
funcB
时,它也会在
funcC
执行脚本,反之亦然。你是如何调用函数的?@bozdoz
funcA
是在
onclick
中调用的。在funcA内部有一个事件监听器,当捕获事件时,它会使funcB被触发。看起来仍然错误,但更正确。只需删除
func()
funcB()因为它们没有真正的意义。还没有完成答案-必须改掉我发布部分答案的坏习惯:-)只有在定义
funcC
之前调用
funcB
才是正确的,我认为OP不打算这样做,因为它被包装在另一个函数中。不需要这样做。可以执行this.funcB和this.funcC,然后执行
var fA=new funcA;fA.funcB()等。或者执行对象文字:
var funcA={funcB:function(){}