javascript详解系列-函数表达式

1.递归

function fact(num){
if(num<1){
return 1;
}
else{
return num*fact(num-1);
}
}

var author = fact;

fact= null;

console.log(author(4));  会出现问题;

改进型:

var fact = (function f(num){
if(num<1){
return 1;
}else{
return num*f(num-1);
}
});

即便把函数赋值给另一个名字,函数依然有效。

2.闭包与变量

作用域链的这种配置机制引出了一个副作用。即闭包只能取得包函数中任何变量的最后一个值。别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量。

function createFunctions(){
var result = new Array();
for(var i=0; i<10; i++){
result[i] = function(){
return i;
}
}
return result;
}

这个函数会返回一个函数数组,表面上看,似乎每个函数都应该返回自己的索引值,即位置0的函数返回0,以此类推。但实际上,每个函数都返回10.因为每个函数的作用域链中都保存着createFunctions()

的活动对象,所以他们引用的都是同一变量i,当函数createFunctions()返回后,变量i的值是10.但此时候函数应用者保存变量i的同一个变量i。所以在函数内部i的值是10;但是我们可以通过创建另一个匿名函数来符合预期,

如下:

function createFunctions(){
var result = new Array();
for(var i=0; i<10; i++){
result[i] = function(num){
return function(){
return num;
}
}(i);
}
return result;
}

在这个版本中,我们没有直接把闭包赋给数组,而是定义了一个匿名函数,并将立即执行的这个结果返回给数组。这里的匿名函数有一个参数num,也就是最终函数要返回的值。在调用每个匿名函数时,我们就传入了

变量i。由于函数参数是按值传递的,所以就将i的当前值赋值给每个参数num;而在这个函数内部,又创建了一个返回num的闭包。这样一来,result数组中每个函数都有自己的num变量的一个副本。因此就可以返回不同的

数值了。

还有一个经典的例子看高三182页。

上一篇:VUE-004-禁止修改页面显示项,设置el-input,textarea只读方法


下一篇:OneZero第三周第二次站立会议(2016.4.5)