我在一个功能中有这两个功能。
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
。
如何解决这个问题?
答案 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
调用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);
}
答案 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();