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
执行脚本,反之亦然。你是如何调用函数的?@bozdozfuncA
是在onclick
中调用的。在funcA内部有一个事件监听器,当捕获事件时,它会使funcB被触发。看起来仍然错误,但更正确。只需删除func()代码>和funcB()代码>因为它们没有真正的意义。还没有完成答案-必须改掉我发布部分答案的坏习惯:-)只有在定义funcC
之前调用funcB
才是正确的,我认为OP不打算这样做,因为它被包装在另一个函数中。不需要这样做。可以执行this.funcB和this.funcC,然后执行var fA=new funcA;fA.funcB()代码>等。或者执行对象文字:var funcA={funcB:function(){}当然,他可以这样做。FuncA=function(){};在编辑时:函数A应该以匿名方式启动或启动,然后存储在变量中,否则不起作用。看小提琴:当然,你们是对的。将更正答案。我喜欢使用closure@RickLancee的第二个选项。