闭包初涉,求解释?
本帖最后由 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')})();
现在你应该很清楚上面代码的意思了吧。