[英]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.