Вложенные функции JavaScript - PullRequest
       2

Вложенные функции JavaScript

0 голосов
/ 14 февраля 2012

Почему

var spo = function(){
   var qq = function(){};
}

выдает ошибку undefined не является функцией, когда

var spo = function(){
   function qq(){};
}

нет?

<ч />

Более сложный пример выдает точную ошибку: Ошибка типа: undefined не является функцией

версия узла v0.6.10, скомпилированная в Ubuntu

spo = function(car){

        var q = 10;
        var s = 'fraggle';

        var qq = function(){
                console.log(s);
        }

        (function(){

                while(q){
                        console.log(q);
                        q--;
                }
                        qq.call();
                        car.call();
        })();


};


spo(function(){console.log('as intended');});

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

В этом qq назначается функция динамически.

var spo = function(){
   // qq is undefined here
   var qq = function(){};
   // qq is defined here
}

С другой стороны, в этом случае qq определяется как функция, которая видна везде в spo

var spo = function(){
   // qq is defined here
   function qq(){};
   // qq is defined here also
}

РЕДАКТИРОВАТЬ: в вашем обновленном коде фактическая проблема видна, без точки с запятой после функции, что приводит к неправильному выражению, как показано ниже

var qq = function(){}()(); // This is causing TypeError

Поставьте точку с запятой после функции.

var qq = function(){
    console.log(s);
};  // you missed this semi colon

(function(){

     while(q){
         console.log(q);
         q--;
     }
     qq.call();
     car.call();
})();
0 голосов
/ 14 февраля 2012

Вам нужно точку с запятой после определения qq. Движок пытается выполнить результат вызова вашей qq функции с аргументом вашей анонимной функции в круглых скобках - если это трудно увидеть, представьте себе удаление новых строк и пробелов, разделяющих определение qq и самоисполняющуюся функцию .

var qq = function() {
}(function() {})();
0 голосов
/ 14 февраля 2012

Попробуйте изменить

qq.call(); 

до

qq();

Поскольку qq - это просто функция и, следовательно, не "объект" с методом call.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...