- 函数的概念
-
- 函数,是将一段公共的代码进行封装,给它起个名字叫“函数”。
- 函数可以一次定义,多次调用。
- 函数,可以将常用的功能代码进行封装。如:用户名的验证、验证码函数、邮箱验证
<script type="text/javascript"> /*1.求0和5的最大值 2.求10和20的最大值 */ function getMax(a,b){ if(a>b) { document.write(a+"大!<br>"); }else{ document.write(b+"大!<br>"); } } getMax(0,5); getMax(10,20); </script>
- 函数的定义格式
function functionName([参数 1],[参数 2],[参数 N]){ 函数的功能代码; [return 参数 r] }
-
- 函数定义格式的说明
-
- function关键字是必须的,全小写。
- funtionName:函数的名称。函数名的命名规则与变量命名一样。
- ():定义函数时接收数据的参数。参数可有可无,多个参数之间用逗号隔开。
-
- 形参(形式参数):定义函数时的参数就是“形参”。主要用来接收调用函数者传过来的数据。
-
- 形参的名称,与变量的命名规则一样。
- 但形参不能用var关键字定义。
- 参数只能存在于函数中。
- 参数不需要声明,直接使用
- 实参(实际参数):调用函数时的参数称为“实参”。实参就是真正的数据。
- {}是函数的功能。
- return语句,用于向函数调用者返回一个值,并立即结束函数的运行。
-
- return用于中止函数的运行。
- break用于中止各种循环。
- 函数的调用
-
- 函数定义是不会执行的,函数必须调用,才会有效果。
- 函数的调用:直接写函数名后跟小括号(),如果有参数则写参数。小括号不能省略。
- 函数的定义和调用部分顺序。
// 定义函数 function showInfo() { document.write("张三的年龄是24岁!"); } // 调用函数 showInfo();<span style="font-size: 16px;"></span>
-
- 函数的参数
-
- 形参的个数,要与实参的个数一致;
- 形参的顺序,要与实参的顺序一致;
- 全局函数和局部函数
-
- 全局变量:
-
- 可以在网页的任何地方(函数内部和函数外部)使用的变量,就是“全局变量”
- 在函数外部定义的变量,就是“全局变量”。
- “全局变量”既可以在函数外使用,也可以在函数内部使用。
- “全局变量”在网页关闭时自动消失(释放空间)。
- 局部变量:
-
- 只能在函数内部使用的变量,成为“局部变量”。
- “局部变量”在函数内部定义,在函数内部使用。
- “局部变量”在函数外部无法访问。
- “局部变量”在函数执行完毕就消失了。
// 全局变量 var name = "张三"; function showInfo() { // 局部变量 var age = 24; document.write(name+"的年龄是:"+age+"岁.<hr />"); } // 调用函数 showInfo(); /*以下程序报错,说age变量不存在 因为age变量是局部变量,函数执行完毕,局部变量就消失了*/ document.write(name+"的年龄是:"+age+"岁");
// 全局变量 var name = "张三"; //全局变量 var age; //全局变量 function showInfo() { age = 24; //给全局变量赋值 // 以下的age是全局变量 document.write(name+"的年龄是:"+age+"岁.<hr />"); } // 调用函数 showInfo(); // 以下输出正常,此时age为全局变量 document.write(name+"的年龄是:"+age+"岁");
// 全局变量 var name = "张三"; //全局变量 var age; //全局变量 function showInfo() { age = 24; //给全局变量赋值 // 以下的age是全局变量 document.write(name+"的年龄是:"+age+"岁.<hr />"); } // 以下程序age变量的值为undefined document.write(name+"的年龄是:"+age+"岁.<hr />"); // 调用函数 showInfo();
// 全局变量 var name = "张三"; //全局变量 function showInfo() { age = 24; //全局变量 document.write(name+"的年龄是:"+age+"岁.<hr />"); } // 以下程序将报错,age不存在。 document.write(name+"的年龄是:"+age+"岁.<hr />"); // 调用函数 showInfo();
-
- 在函数内部,省略关键字var定义的变量是“全局变量”。
- 注意:var关键字尽量别省略,省略后“全局变量”和“局部变量”会搞不清楚。
- 拷贝传值和引用
-
- 拷贝传值:基本数据类型都是“拷贝传值”
-
- 拷贝传值,就是将一个变量的值“拷贝”一份,传给了另一个变量。
- 拷贝传值中,两个变量之间没有任何联系,修改其中一个变量的值,另一个不会改变。
// (1)拷贝传值:将一个变量的值“拷贝”一份,传给了另一个变量。 var a = 10; //声明变量 var b = a; //将变量a的值“拷贝”一份,赋给变量b a = 100; //重新给变量赋值100 alert(b); //b = 10 alert(a); //a = 100<span style="font-size: 16px;"></span>
-
- 引用传址:复合数据类型都是“引用传址”
-
- 复合数据类型的存储分两步:
-
- 将变量名和数据地址存在“快速内存”(栈内存)中;
- 具体的数据存在“慢速内存”(堆内存)中。
- 基本数据类型存在“快速内存”(栈内存)中的。因为,基本数据类型只有一个变量名和变量值。
- 引用传值:将一个变量的数据地址,“拷贝”一份,传给了另一个变量。这两个变量,指向了“同一个地址”。大家共享同一份数据。
- 如果其中一个变量的值发生了改变,那么,另一个变量的值也得变。要变一起变。因此这两个变量是有联系的,要变大家一起变。
var arr1 = ["张三",24,"大专"]; var arr2 = arr1; //将arr1的地址“拷贝”一份,传给了另一个变量arr2 arr1[1] = 30; //给变量arr1[1]重新赋值 window.alert(arr2[1]); //arr2[1]=30
// 实例:引用传址的使用
/*
在函数外定义一个数组,通过传参的方式,传给函数。
在函数内部给该数组的末尾增加一个元素
*/
var arr = ["张三",24,"男"];
function addElement(arr2)
{
// 给当前数组末尾增加一个“北京科技大学”的元素
arr2[arr2.length] = "北京科技大学";
/*
arr2[3] = "北京科技大学"
*/
}
// 调用函数;将数组的地址“拷贝”一份,传给了函数参数
addElement(arr);
// 输出数组变量arr的值,会发现变成了4个元素
document.write(arr);
- 匿名函数:没有名字的函数。
-
- 匿名函数不能单独定义的,也不能单独调用。
// 以下写法是错误的 // 定义函数 function() { document.wrtie("大家好"); } // 调用函数<span style="font-size: 16px;"></span>
- 匿名函数不能单独定义的,也不能单独调用。
-
- 匿名函数,一般是作为数据给其他变量赋值的。可以给普通变量、数组元素、对象的属性赋值。
var a = 10; //将数值赋给变量a,那么变量a就是“数值型”变量 var a = "abc"; //将字符赋给变量a,那么变量a就是“字符型”变量 var a = true; //将布尔值赋给变量a,那么变量a就是“布尔型”变量 var a = [10,20]; //将数组赋给变量a,那么变量a就是“数组型”变量 var a = function(name,age){ //将函数赋给变量a,那么变量a就是“函数型”变量 window.alert(name+"的年龄是:"+age); return a; } a("张三",25); var b = a; //将变量a的地址"拷贝"一份传给了变量b b("李四",20);<span style="font-size: 16px;"></span>
- 匿名函数,一般是作为数据给其他变量赋值的。可以给普通变量、数组元素、对象的属性赋值。
- 二维数组
-
- 给一个数组元素赋一个数组,那么,这个数组就是“二维数组”。
- 二维数组跟表格很像
var arr = [ [0,1,2,3,4], [10,20,30,40], [50,60,70,80], ];<span style="font-size: 16px;"></span>
-
- 二维数组,就得用两层循环来实现。也就是说循环套循环
- 二维数组的循环,与二维表格的循环一模一样。
- 二维数组的访问:数组名后跟多个连续的中括号[],第1个中括号[]代表第一维数组,第2个中括号[]代表第二维数组。
var arr = [ ["周更胜","男",30,true,"大专",5000,500,,"山东省"], ["刘二狗","女",26,false,"研究生",8000,1500,"北京科技大学","山西省"], ["系老黑","男",38,true,"大专",1000,250,"清华大学","山西省"], ["利可汗","男",34,true,"高中",11000,30,"河北大学","江苏省"] ]; var str = "<table width=600 border=1 rules=all align=center>"; for(var i=0;i<arr.length;i++) { str += "<tr>"; // a<小数组的长度 for(var a=0;a<arr[i].length;a++) { str += "<td>"+arr[i][a]+"</td>"; } str += "</tr>"; } str += "</table>"; document.write(str);
显示效果: