JavsScript系列──函数参数
作者:yinwm
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明。
今天说一下函数参数。
函数参数,可以理解为函数的参数,还有就是函数作为参数(还是挺诡意)。
首先说一下函数的参数。
这个问题看上去没有什么可说的。因为作为拍代码的,都肯定知道这个东西。
function method1(a, b) {
return a + b;
}
很简单,a,b就是函数method1的参数。一般情况下,这样足够了。
但是在JavaScript当中,函数的调用,其中的参数个数是不强制的。(作为脚本语言,当然类型也没有强制)。
这里很象某些语言的不定参数列表(由于我没有过多的研究,所以不便多说)。
比如上面的方法
var c = method1(1,2); //正确
var d = method(1); //也正确
此时c的值是3,d的值是NaN。
那么我们如何来保证参数的个数呢?
JavaScript当中,每一个方法里面,有一个内欠的变量,arguments。这是一个数组变量,记录着传入这个方法一共有几个参数。
很象java里面main函数的 args数组
static public void main(String args[]) {…}
我们可以使用arguments.length来判断一共有几个参数
function method2() {
if (arguments.length == 2) {
return arguments[0] + arguments[1];
} else {
return 0;
}
}
这样我们就可以保证参数的个数了。
接下来,我们说一下函数作为参数。
在昨天的例子当中,我使用了很多这样的例子。比如
ServerHandler.getName(myID, fucntion (name) {
alert(”Hello:” + name);
});
这里面,getName方法的第二个参数就是一个方法,
function (name) {…}
在JavaScript
当中,任何的东西都是Object,一个函数的类型是Function,他是Object的一个子类(姑且这么说,JavaScript不是一个纯粹的面
向对象的语言,所以说子类有一些牵强)。所有的Object都可以作为参数被传入函数。那么一个函数作为参数就不足为奇了。
暂停一下,我们现来看一下这个例子。
function method3() {
alert(”Hello”);
}
var m = method1;
var v = method1();
上面的两个变量,m,v,他们的区别就是,v是method1运算的结果,在这里是undefined,因为method3在alert以后什么都没有返回。
而m,这句付值语句,是把method3的函数体,付值给了m(有兴趣的话,可以使用alert(m)来看一下结果)。如果现在写下如下的语句
m();
那么就会调用这个函数,然后alert一个Hello。
好,我们回来,上面我想说明的就是,当一个函数作为参数传入到另外的一个函数当中,我们是可以使用一个参数变量来接受这个函数的。并且在需要的时候,我们可以继续的分发,或者调用。
比如
function method4(m) {
m();
}
method4(method3); //注意,这里面的method3没有后面的括号(),他表示是这个函数体作为参数而不是运行结果作为参数。
在进入到method4里面之后,通过参数变量m,可以调用method3。
利 用函数作为参数,在JavaScript中使用的最普遍的就是callback方法了。当需要执行一个函数,传入一个callback
function用来处理结果。这种方法我们在很多地方已经使用的非常多了。现在随着AJAX的流行,callback方法也越来的重要。如我昨天所说,
很多的和server通讯的方法都是无法预料何时能够结束的。那么传入一个callback function就很方便了。
这里,我一直有这样的一个难点,始终没有很好的解决办法。
就是一般情况,我们给出callback function,都是在无法控制返回时间的情况下采用的,那么此时,大多数的情况就是这个方法会使用另外的线程来执行,而程序会继续向下走。
使用返回值的函数调用,是会在这个函数调用的时候,线程阻塞,直到返回结果。
我现在遇到的情况就是,很多的时候,我无法返回值(比如AJAX),而使用callback function也挺麻烦。所以一直没有好的方法。
虽然我昨天说的信号量的方法可以变通的解决这个问题。但是在复杂的情况下(比如我现在正在开发的一套Web UI Framework)里面也是挺麻烦的。希望大家如果有好的方法可以告诉我。
最后,还要提及的一点就是,在函数调用的时候,还有一种方法就是call(或者apply)调用。
function method5(msg) {
alert(msg);
}
method5.call(x, “Hello”);
这个x就是某个Object的变量(从面向对象的角度可以说是一个实例(instance))。很类似于python的self。
这个使用方法在一般情况下意义不大。但是在某种面向对象实现的时候是非常有用的。我会在面向对象的文章中再次说明的。