关于闭包传参和不传参

请问以下两个为什么不一样?

 var a=1;
    (function(){
        a++;
    })();
    alert(a);//2
 var a=1;
    (function(a){    
        a++;
    })(a);
    alert(a);//1

闭包传参和不传参的区别是什么呢?

阅读 11.4k
5 个回答
var a=1;//[1]
(function(){
    a++;
})();//[2]
console.log(a);//2

立即执行函数[2]定义的函数为一个闭包函数,在函数体内的变量a指向[1]处声明的变量
所以当立即执行函数[2]执行完毕后,a的值为2

var a=1;//[1]
(function(a){    
    a++;
    console.log(a);//输出2
})(a);//[2]
console.log(a);//1

立即执行函数[2]不形成任何闭包,在函数体内的变量a为函数生成的形参变量,和[1]处声明的变量没有关系,只是名字相同而已~~~

如果修改如下代码,那么输出就为2,有闭包函数形成

var a=1;//[1]
(function(b){    
    a++;
    console.log(a);//输出2
})(a);//[2]
console.log(a);//2

自己体会吧

var a=1;
    (function(){
        a++;
    })();
    alert(a);//2
 var a=1;
    (function(a_in_fun){    
        a_in_fun++;
    })(a);
    alert(a);//1

我想说,这两个函数,算哪门子的闭包?

第一个例子立即函数中的a变量是global的a;
第二个例子立即函数中的a屏蔽了全局变量a,是局部变量,对局部变量a的改变不会影响到global的a。

两点∶一是直接修改数据还是通过函数传参修改数据,二是数值类型是传值并非传参。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题