关于匿名函数和闭包的讨论

时间:2021-07-23 22:40:47
什么是匿名函数. 什么是闭包?
 (function(){ 
/*相关代码*/ 
})(); 

 这只是个匿名函数. 
闭包的定义是
当一个嵌套的函数被输出到它被定义的作用域之外.只有嵌套函数被如此使用时,才被明确的称为闭包.

只是有人会用匿名函数返回一个函数. 这样形成的闭包函数有 只有这个函数自己才能访问的属性
比如说  
uniqueID  =  ( function ()   {   //  这个函数的调用对象保存值 
      var  id  =   0 ;            //  这是私有恒久的那个值 
      //  外层函数返回一个有权访问恒久值的嵌套的函数 
      //  那就是我们保存在变量uniqueID里的嵌套函数. 
       return   function ()   {  return  id ++ ; } ;   //  返回,自加. 
 } )();  //  在定义后调用外层函数.

这样的话.就只有调用这个函数才能访问这个ID.   
用匿名函数创建闭包.可以很好的保护属性


我看到很多人在回答别人的问题时.认为匿名函数就是闭包. 这点是如何得出的呢?

14 个解决方案

#1


http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html
匿名函数

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。

1、函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式

第一种:这也是最常规的一种

function double( x ){
    return 2 * x;   
}
第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。


var double = new Function( 'x'  , ' return 2 * x;');
第三种:

......

#2


匿名函数当然不是闭包,只不过闭包经常发生在匿名函数中.匿名函数是个没有指针(引用)指向的函数.闭包是js的一种特性.

#3


楼上正解

#4


比如这个帖子
http://topic.csdn.net/u/20090513/09/7d5be4f8-8201-48d6-8626-a775b4412565.html

这个
http://topic.csdn.net/u/20090506/14/8951954a-65df-4058-a654-69e18b33b414.html

#5


学习了....

#6


说简单一点,匿名函数就是没有名字的函数,
所有的函数都可以成为闭包, 但要看在什么时候用。
其实本来可以没有匿名函数,因为既然函数主体都出来了,给它个名字又何妨;但是使用匿名函数可以形成比较独立的作用域,而且外部没发直接访问它; 可以简化编程,提高编程效率和可读性;
我见过最爽的匿名函数就是像这样写阶乘:

var a = (function(n){
if(n<1){
alert("invalid arguments");
return 0;
}
if(n==1){
return 1;
}
else{
return n * arguments.callee(n-1); 
}
})(4);
alert(a);

闭包之所以这么“火” 就是因为它看起来似乎突破了函数本因该有的作用域;
但是只要理解了javascript是静态作用域(就是作用域在函数定义的时候就确定了),就不难理解其实闭包并没有突破自己的作用域;恰恰说明了js是静态作用域;只是表现的让我们读起来有点不自然而已。

#7


一篇关于作用域,闭包,js寻址的文章推荐给楼主,也是我转载的:
http://blog.csdn.net/sunxing007/archive/2009/04/27/4129178.aspx

#8


看完了你会觉得没有匿名函数和闭包之争, 只是 静态作用域 的原因。

#9


var a=function(){};//此时就是把匿名函数赋值给a 这个变量了。

var b=function(){
   alert();
}();

//此时就是必包。相当于实例化B函数 or  b();

匿名函数是匿名函数,怎么可能匿名函数就是必包呢?

2者之间是有区别的

#10


我觉得这是2种概念.
 闭包还可以用来取代 面向对象

#11


在我看来,这东西除了写法上的讲究和运行的方式不同外,其它的没什么,
倒是6楼的让我学到了点有趣东西!

#12


在我理解的层次.

凡是没有命名的函数都是匿名函数.如:
function(){}
他是一个匿名函数.也就是函数定义的实体.

闭包则是函数运行时的实体.如:
(function(){alert(i)})(i)
赋不赋给变量都没所谓.
差别就在于.如果i存在.
闭包中的匿名函数可以调用到i.

也可以像sunxing007的理解.
因为i看来只是闭包函数的参数.
作用域只在上面的function(){alert(i)}外.
但实际上function还是能拿到i.
因为匿名函数的定义体还在闭包函数的作用域里.

另外(function)()可以看作,var a=function,a()

#13


我不确定LS的说法时候正确
 是否有高人来说明一下


闭包则是函数运行时的实体.如: 
(function(){alert(i)})(i) 

 关于LS的这个说法是否正确呢.
 这个是闭包么?

#14


引用 6 楼 sunxing007 的回复:
说简单一点,匿名函数就是没有名字的函数, 
所有的函数都可以成为闭包, 但要看在什么时候用。 
其实本来可以没有匿名函数,因为既然函数主体都出来了,给它个名字又何妨;但是使用匿名函数可以形成比较独立的作用域,而且外部没发直接访问它; 可以简化编程,提高编程效率和可读性; 
我见过最爽的匿名函数就是像这样写阶乘: 

JScript code
var a = (function(n){
        if(n<1){
                alert("invalid …

6楼说的比较正确,支持了。

#1


http://www.cnblogs.com/rainman/archive/2009/05/04/1448899.html
匿名函数

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途。匿名函数:就是没有函数名的函数。

1、函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式

第一种:这也是最常规的一种

function double( x ){
    return 2 * x;   
}
第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用。


var double = new Function( 'x'  , ' return 2 * x;');
第三种:

......

#2


匿名函数当然不是闭包,只不过闭包经常发生在匿名函数中.匿名函数是个没有指针(引用)指向的函数.闭包是js的一种特性.

#3


楼上正解

#4


比如这个帖子
http://topic.csdn.net/u/20090513/09/7d5be4f8-8201-48d6-8626-a775b4412565.html

这个
http://topic.csdn.net/u/20090506/14/8951954a-65df-4058-a654-69e18b33b414.html

#5


学习了....

#6


说简单一点,匿名函数就是没有名字的函数,
所有的函数都可以成为闭包, 但要看在什么时候用。
其实本来可以没有匿名函数,因为既然函数主体都出来了,给它个名字又何妨;但是使用匿名函数可以形成比较独立的作用域,而且外部没发直接访问它; 可以简化编程,提高编程效率和可读性;
我见过最爽的匿名函数就是像这样写阶乘:

var a = (function(n){
if(n<1){
alert("invalid arguments");
return 0;
}
if(n==1){
return 1;
}
else{
return n * arguments.callee(n-1); 
}
})(4);
alert(a);

闭包之所以这么“火” 就是因为它看起来似乎突破了函数本因该有的作用域;
但是只要理解了javascript是静态作用域(就是作用域在函数定义的时候就确定了),就不难理解其实闭包并没有突破自己的作用域;恰恰说明了js是静态作用域;只是表现的让我们读起来有点不自然而已。

#7


一篇关于作用域,闭包,js寻址的文章推荐给楼主,也是我转载的:
http://blog.csdn.net/sunxing007/archive/2009/04/27/4129178.aspx

#8


看完了你会觉得没有匿名函数和闭包之争, 只是 静态作用域 的原因。

#9


var a=function(){};//此时就是把匿名函数赋值给a 这个变量了。

var b=function(){
   alert();
}();

//此时就是必包。相当于实例化B函数 or  b();

匿名函数是匿名函数,怎么可能匿名函数就是必包呢?

2者之间是有区别的

#10


我觉得这是2种概念.
 闭包还可以用来取代 面向对象

#11


在我看来,这东西除了写法上的讲究和运行的方式不同外,其它的没什么,
倒是6楼的让我学到了点有趣东西!

#12


在我理解的层次.

凡是没有命名的函数都是匿名函数.如:
function(){}
他是一个匿名函数.也就是函数定义的实体.

闭包则是函数运行时的实体.如:
(function(){alert(i)})(i)
赋不赋给变量都没所谓.
差别就在于.如果i存在.
闭包中的匿名函数可以调用到i.

也可以像sunxing007的理解.
因为i看来只是闭包函数的参数.
作用域只在上面的function(){alert(i)}外.
但实际上function还是能拿到i.
因为匿名函数的定义体还在闭包函数的作用域里.

另外(function)()可以看作,var a=function,a()

#13


我不确定LS的说法时候正确
 是否有高人来说明一下


闭包则是函数运行时的实体.如: 
(function(){alert(i)})(i) 

 关于LS的这个说法是否正确呢.
 这个是闭包么?

#14


引用 6 楼 sunxing007 的回复:
说简单一点,匿名函数就是没有名字的函数, 
所有的函数都可以成为闭包, 但要看在什么时候用。 
其实本来可以没有匿名函数,因为既然函数主体都出来了,给它个名字又何妨;但是使用匿名函数可以形成比较独立的作用域,而且外部没发直接访问它; 可以简化编程,提高编程效率和可读性; 
我见过最爽的匿名函数就是像这样写阶乘: 

JScript code
var a = (function(n){
        if(n<1){
                alert("invalid …

6楼说的比较正确,支持了。