簡體   English   中英

變量函數未定義錯誤

[英]variable function undefined error

我有這兩個功能,在一個功能內。

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 ,那么它們如何被聲明/初始化並不重要,你將會有一個無限循環,可能導致類似堆棧溢出的錯誤,或者崩潰的瀏覽器( /標簽)。

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();
   }
}

它會奏效。 你為什么問? 在此處閱讀有關提升,范圍,函數聲明和函數表達式的更多信息

在這里檢查小提琴

當然它將是一個無限循環,所以不要這樣做,但它將是正確的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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM