日期:2014-05-16  浏览次数:20530 次

闭包初涉,求解释?
本帖最后由 DNB_duzhe 于 2012-12-27 17:20:31 编辑
参考信息:

function funA(x){
return function(y){
return x*y;
}
}

alert(funA(100)(100));

var uniqueID = (function fun(){
var id = 0;
return function(){
return id++;
}
})();

alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
alert(uniqueID());


求解点:
function fun(x){
return function(y){
return x*y;
}
}

alert(fun(100)小括号A(100));


var uniqueID = (function fun(){
var id = 0;
return function(){
return id++;
}
})小括号B();

alert(uniqueID小括号C());

以上的小括号分别起到的作用是?请从JS语言原理方面解答。

注释:小括号分别指:跟在后面的那个小括号!


附:感谢各位大神参与回答,谢谢

------解决方案--------------------

function funA(x){
    return function(y){
        return x*y;
    }
}
//alert(funA(100)(100));//==>等价于
var tmp = funA(100);//tmp = function(y){return 100*y}
alert(tmp(100));
 
var uniqueID = (function fun(){
    var id = 0;
    return function(){
        return id++;
    }
})();//执行结果,uniqueID为一个函数,函数体为:function(){return id++}。函数的执行环境中有个私有变量id,只有本函数能访问,每执行一次该函数,id都+1。
alert(uniqueID);
 
alert(uniqueID());
alert(uniqueID());
alert(uniqueID());
alert(uniqueID());

------解决方案--------------------
所谓闭包,如果从广义上理解是相当复杂的。但是从狭义上理解还是相对比较简单。就是外部不能直接调用内部的函数或者变量。

先从javascript说起吧。
javascript的是闭包的,调用时外部函数不能调用函数内部的变量的。假如想要调用可以让一个函数返回来调用。
function Fruit(){
var b = 'b';
var a = 'a';

}

比如上述代码,Fruit函数内部的变量 b与a ,不能 用 Fruit.a 或者Fruit.b 来调用,同样也不可以用
(new Fruit()).a 或者(new Fruit()).b来调用,这是因为闭包。
如果把想要调用则必须要返回。
function Fruit(){
var b = 'b';
var a = 'a';
return {_a:a,_b:b}
}
这样就可以 Fruit()._a 与 Fruit()._b调用到内部变量。
javascript 返回的类型中 有一种类型为 function  可以用typeof 来判断
比如一个 对象 func
alert(typeof func)
对于function 类型的对象,都可以在他后面加上()来调用。
比如:
var obj = (function(){return function(){alert('b')}});
比如上述代码的 obj 实际上是function的一个对象,调用 typeof 判断为 function
所以obj是可以调用的。
即 执行 obj(); 可以打印出 b。
理解了javascript中function对象是可以调用的,这一层意思以后
那么就不难理解,下面这句话的意思了。实际是一个匿名函数直接被调用了。
(function(){alert('func')})();
现在你应该很清楚上面代码的意思了吧。