JavaScript嵌套函数

时间:2012-02-14 06:07:47

标签: javascript closures

为什么

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

抛出错误undefined不是

时的函数
var spo = function(){
   function qq(){};
}

没有?


更详细的示例抛出了确切的错误:TypeError:undefined不是函数

在Ubuntu上编译的节点版本v0.6.10

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在定义qq后,您需要一个分号。引擎试图用括号中的匿名函数的参数执行调用qq函数的结果 - 如果很难看到,想象一下删除分隔qq定义的新行和空格自动执行功能。

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

答案 2 :(得分:-3)

尝试更改

qq.call(); 

qq();

由于qq只是一个函数,因此不是方法call的“对象”。