2014-05-14 3 views
0

У меня есть две функции, внутри одной функции.переменная функция 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.

как исправить эту проблему?

+6

Вызов funCC() в funcB() и наоборот. Разве это не даст бесконечный цикл? – malkam

+1

В вашем примере есть несколько проблем, из-за чего трудно понять, какова может быть проблема. Во-первых, если вы выполняете funcA, не будет никакого способа выполнить funcB и funcC, поскольку они будут скрыты в области funcA. Во-вторых, то, что у вас было бы, приведет к бесконечному рекурсивному циклу, если вы вызвали funcB или funcC – rom99

+0

, спасибо @malkam за то, что указали мне это, что я пытаюсь сделать, когда вы вызываете 'funcB', он также выполняет скрипты на' funcC' наоборот. –

ответ

0

Возможно, вы задаете неправильный вопрос, так как взаимосвязанные методы редко заканчиваются счастливо.

Ответ на ваш вопрос действительно из-за this earlier answer regarding when functions actually exist. В частности, прочитайте о подъеме функции.

var funcA = function() { 

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

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

funcA.funcB(); 
+0

Все еще выглядит неправильно, но правильнее. Следует просто удалить 'funcC();' и 'funcB();', поскольку они на самом деле не имеют смысла. – bozdoz

+0

Не закончил отвечать - должен отказаться от моей плохой привычки публиковать частичные ответы :-) – vogomatix

+0

Исправлен ответ – vogomatix

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

Однако, если funcBfuncC вызовы и вызовы funcCfuncB, это не имеет значения, как они объявлены/инициализируется, вы будете иметь бесконечный цикл, вероятно, приводит к ошибке переполнения стека или сбою браузера (/ 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); 
} 
+0

Это верно, только если 'funcB' вызывается до того, как' funcC' определен, что я не думаю, что OP означает так как он завернут в другую функцию. – bozdoz

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(); 
+0

Не нужно так делать. Мог бы сделать this.funcB и this.funcC, а затем сделать var var = FА; fA.funcB(); 'и т. д. Или сделать литерал объекта:' var funcA = {funcB: function() {}}; '. – bozdoz

+0

Да, конечно, он мог это сделать. FuncA = function() {}; – avidenic

+0

На вашем редактировании: функция A должна быть запущена анонимно или запущена, а затем сохранена в переменной, это не работает иначе. Смотрите скрипку: http://jsfiddle.net/SsmDG/1/ –

Смежные вопросы