《JavaScript教程》10章 函数


在JavaScript中函数的定义比其他语言自由的多,过程也是函数。函数可以给他一个返回值,也可以不给。参数即可以显式定义,也可以不定义而在调用时直接传递。注意,JavaScript中函数变成了对象,这样一来可以解决许多疑难杂症,不过,使用时要当心。

关于参数传递,即形式参数还是值参数。JavaScript和Java是完全相同,是值传递参数,也就是说,在函数体中,不管参数如何被修改,都不影响调用处变量的值。

当参数是对象时,该对象的属性值被修改时,外面调用处的内容也同时被修改。因为值传递参数时,所传送的实际上是地址,也就是函数外面的对象地址被传经来了,所以函数里面和外面用的是同一对象。(初学者可以只记住现象。)

函数定义
//标准函数的写法
function funcName (arg1, arg2, ...) {
    ···
    return retValue;
}
xx = funcName(para1, para2, ...);
//没有返回值的函数写法
function funcName (arg1, arg2, ...) {
    ···
    //return retValue;
}
funcName(para1, para2, ...);

//如果硬要写成以下格式,则xx的结果为: "undefined"。
xx = funcName(para1, para2, ...);   //xx的结果为: "undefined"
//隐式使用参数的函数写法
function funcName () {
    //用法参考
    for (i=0; i<funcName.arguments.length; i++) {
       alert(funcName.arguments[i]);
    }
    ···
}
xx = funcName("aaa",123);    //结果显示2次对话框
//作为对象的函数写法
//和上面的方法相同,这种写法不常见
funcName = function(arg1, arg2, ..., statements) {
    ···
}
//一次性被使用的函数写法
//这是上面方法的引申,一般没有参数,函数名也不需要。例如:
window.onbeforeunload = function() {
    ···
}

参数传递
//下例传递3种类型的数据(注意:初学者不要深究)
function testPara(objX1, objX2, strY, intZ) {
    objX1.value = "对象1内容已经被修改";
    objX2 = objX1;
    //注意和上一句的区别
    strY = "字符串没有被修改";
    intZ = 9876;
}
<!--以下是HTML文中的例子-->
<input id="id1" value="原先的对象1内容">
<input id="id2" value="原先的对象2内容">
<script type="text/javascript">
<!--
var objA1 = document.getElementById("id1");
var objA2 = document.getElementById("id2");
var strB  = "原先的字符串";
var intC  = 1234;

testPara(objA1, objA2, strB, intC);

alert(objA1.value);  //显示: 对象1内容已经被修改
alert(objA2.value);  //显示: 原先的对象2内容
alert(strB);         //显示: 原先的字符串
alert(intC);         //显示: 1234
// -->
</script>

参数的取得
func.arguments //结果是数组,数组长度就是参数个数