在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 //结果是数组,数组长度就是参数个数