作者:王先帅
1.函数的理解
函数对于一个上了一二十年学的人来说是再熟悉不过的一个东西了,上初中的时候我们就会一次函数,例如
y=kx+b(k,b是常数,k≠0);如:y=2x+3,这就是一个一次函数的例子,我们可以把这个一次函数转变为一个javascript函数:function linearFun(x){y=2*x+3;return y};这就是一个一次函数的javascript函数,我们可以调用这个函数,使用定义的函数名,如linearFun(2),这里的y就返回了7,很简单,小学生都会的算数题目y=2*2+3,y=7;你可以在控制台里做一个输出;好了,这里就不多做解释了。
2.参数
function sum(a,b,c){var z=a+b+c;return z};这个例子是先带入一下,这里的参数就是a,b,c,所以说函数的参数是想传多少就传多少,但是这个函数有一个弊端就是函数里面只写了三个参数,那么如果我想求4个数的sum怎么办,如:我想求sum(1,2,3,4),怎么办呢,没办法,这个函数弊端就凸显出来了,可复用性很低。那么重头戏来了,如何解决呢?看下一段代码:
function Sum(){
var i,arr=0;
for(i=0;i<=arguments.length;i++){
arr+=arguments[i];
};
return arr;
};
这段代码就稍微复杂一点了,不过也比较好理解,这段代码和上面那段代码有着相似之处就是求和,不过这段代码你想传任何数量的值进去都可以,我们在控制台打印一下:
与上面那个函数相比这个函数的复用性就很高,虽然是一小段代码不过里面用到的东西还是很多的,例如for循环,arguments对象,for循环应该有任何语言基础的人都知道,这里不多做解释了,arguments在你没有理解javascript对象之前你就暂且把它理解成一个数组对象吧,这个数组对象存储的是你传进来的Sum函数的参数,例如你传进来的参数使(1,2,3,4,5,6,7),那么这个arguments就是[1,2,3,4,5,6,7];(数组我在我的另一篇文章里面已经做了入门讲解)。知道了这些,这段代码就很容易理解了.arr+=arguments[i]就和arr=arr+arguments[i],懂了吧,循环数组中的数值并进行累加,就这么简单,这个数组是可变的,你传啥数组就是啥;这节一不小心讲多了。
3.变量的作用域
讲到函数就不的不讲变量,讲到变量就不得不讲变量的作用域,变量就是字面意思,这里就不多做解释了,重要的是变量的作用域,先做一个字面解释在做一个代码解释:字面解释就是定义一个变量,再定义一个函数,这个变量在函数的外面:例如:var a=1;function showA(){alert(a)};这里就会弹出1.为什么呢?因为这时候的变量a就是全局变量,即声明在所有函数外面的变量,同样所有函数也能调用这个变量,相反的是局部变量,即,声明在函数内部的变量,只能在本身函数内部访问,函数外部及其他函数无法访问。下面来一个例子:
var a=1;
function Fun(){
var b=2;
alert(a);
};
alert(b);
结果就显而易见了,Fun函数可访问外部的a变量;但是在函数外部alert(b)时就会报错,因为b变量是局部变量,除函数Fun本身可访问外部无法访问。
4.回调函数
函数的参数在第二节我已经讲过了,其实函数的参数也可以是一个函数,这就涉及到函数的回调,下面我们来通过几个例子来解释一下函数的回调:
第一个例子:
function Mul(a,b,c){
var i,arr=[];
for(i=0;i<3;i++){
arr[i]=arguments[i]*3;
}
return arr;
}
Mul(1,2,3);
这里返回值是一个数组[3,6,9];但是如果我要把这个返回的数组传递给另一个函数怎么办呢?例如我想把这个返回的数组传递个另一个函数,让数组里面的所有值都加1;
代码如下:
function addOne(a){
return a+1;
};
var arrOne=[];
for(i=0;i<3;i++){
arrOne[i]=addOne(arr[i])
};
具体代码如上所示,其实也就是把上面两段代码合并到一起,将Mul函数的返回值赋值给arrone数组,然后调用addOne函数将arrone数组依次加1,这样就实现了不同函数之间的传参。是不是看花眼了,没事,不用担心,下面我们来利用回掉函数来对这个例子进行改写:
function Mul(a,b,c,callback){
var i,arr=[];
for(i=0;i<3;i++){
arr[i]=callback(arguments[i]*3);
}
return arr;
}
上面这串代码与之前的代码有着很大的相似度,唯一的区别就是在Mul函数后面又加了一个参数callback,上面我也说了,函数的参数可以传一个数,也可以传一个函数,那么这个callback就是一个函数。下面我来用控制台对这个例子进行输出;
大家看上面的代码,Mul函数传递了四个参数,最后一个callback就是他的回调函数,我们可以事先将这个函数定义好,也可以使用匿名函数来代替Mul(1,2,3,function(a){return a+1});
这样一个简单的回调函数示例就写好了,现在我再把回调函数的定义说一下:回调函数就是把第一个函数传递给第二个函数,并且由第二个函数来执行的第一个函数,那么这个第一个函数就是回调函数。这里的addOne就是所谓的回调函数;
5.函数的其他特例
5.1函数的返回值
其实每一个函数的执行都会有一个返回值,这个返回值你可以自己定义,例如:function a(){alert("A");return "A"};这个函数在执行之后就会返回一个字符“A”,当然函数的返回值也可以是一个函数,例如function a(){alert("A");return function(){alert("b")}},这个函数在执行完之后就会返回function(){alert("b")};那么我们进行两次执行例如:a();这个是执行alert(“A”)那个函数,返回alert("b");那么再一次执行a()(),就是执行两遍a函数就会执行到
function(){alert("b")};这个代码段。
5.2函数的重写
上面一个小结我们已经了解到了函数的返回值,其实函数也是可以进行重写的,你只需要把函数的返回值再次赋给本身就可以进行函数的重写,例如:
function a(){
alert("a");
a=function(){
alert("b");
}
}
上面的这段代码非常的简单,当你调用a的时候会alert(‘a’)出来,同时又把alert("b")赋值给a函数,这样a函数的值就会改变,所以当你再一次调用a的时候alert就不再是a,而是b。
其实上面的五个小节我仅仅带大家了解了函数的基础内容,函数最重要的内容其实是“闭包”,“闭包”我会在后期用单独一篇文章来带大家了解。