1 function foo(x){ 2 var y =1; (z){ 4 y = y+1; 5 print(x+y+z); 6 } 7 } bar=foo(1); 10 bar(1);
我们可以看到上面代码中foo的返回值本身就是一个匿名函数,如果我们多次调用bar(1),可以发现foo函数的局部变量y的值是一直在递增。
闭包在实际的应用中,一般是用来封装对复杂数据结构的各种操作,从而对外提供简单易用的接口,用户在使用时不用太关心闭包内部的实现细节。
4.6 函数的可变参数JavaScript在调用函数时,并不会限制传入参数的个数,当传入参数的个数多于函数定义中参数的个数时,多余的参数会被忽略;当传入参数的个数小于函数定义中参数的个数时,缺失的参数默认是undefined。
我们来看下面的例子:
1 function argumentTest(v1,v2,v3,v4){ 2 print(v1+v2+v3+v4); 3 } argumentTest(1,2,3); 7 argumentTest(1,2,3,4,5); NaN 12 10
可以看到,当我们给出的参数有缺失时,默认的undefined和其他参数做运算时,返回了NaN。当我们给出的参数有富余时,被自动忽略了。
在JavaScript中,函数中有默认的一个变量,名为arguments(在这里,arguments并不是一个数组,typeof arguments返回的是object),它用来保存所有传入的参数,我们来看下面的例子:
1 function argumentTest(v1,v2,v3,v4){ 2 var result=0; 3 for(var i = 0; i < arguments.length;i++){ 4 result=result+arguments[i]; 5 } 6 print(result); 7 } argumentTest(1,2,3); 11 argumentTest(1,2,3,4,5); 6 15 15
这里我们可以看到,无论我们传入了多少参数,都可以被适当的处理了。