函数就是把完成特定功能的一段代码封装起来。给该功能起一个名字(函数名)。
哪里需要实现该功能就在哪里调用该函数。
函数可以在任何时间任何地方调用。
函数声明也叫函数定义。
使用函数,必须要先定义。
语法:
javascript function 函数名(形式参数1, 形式参数2, ...){ //函数体 }
说明:
注意: - 如果仅仅声明了函数,而没有在别的任何地方使用这个函数,则这个函数永远不会执行。 - 使用函数,我们称之为函数调用。 - 永远记住这句话: 函数只有被调用才能被执行
函数声明实例:javascript /* 声明了一个函数,名字为printKiss 功能:循环打印十次文本 */ function printKiss () { //函数不调用是不会走这段代码的。 for (var i = 0; i < 10; i++) { console.log("要亲亲,要抱抱,要举高高。"); } }
函数只有被调用才能被执行。所以,如果要让函数内的代码执行,则必须先调用。
函数调用语法:
javascript 函数名(实参1,实参2。。。);
说明:
调用方法的时候,方法名是必须的。而且方法名是找到已定义的函数的唯一识别。 函数调用时,方法名后面的一对圆括号不能省略。
实参(实际参数)列表,对应着函数声明的形参列表部分。传递的实参,会被形参接受,然后就可以在函数内部 使用了。
可以用一个变量去存储方法执行完毕之后的返回值。
函数调用实例:
javascript //利用方法名 printKiss去掉用。 printKiss(); //可以多次调用同一个函数,这也是复用的特性。 printKiss();
函数名是一个函数非常重要的特征,为了方便调用者调用函数,函数的命名必须遵循一定的规范。
不能使用系统的关键字和保留字
命名要有意义:见名知意。从方法名应该可以大致推测到这个方法的功能。不要起诸如a、b这些没有意义的方 法名,
业界多采用驼峰命名法来给函数命名。驼峰命名法:首字母小写,其余单词的首字母大写。例如:add、 onCreate、doSomething。(xxxYyyZzz)
函数的命名是严格区分大小写的。比如:add和Add是两个完全不同的函数名。
注意:声明函数时,如果后定义的函数名与前面定义的函数名重复了,则后定义的会覆盖前定义的。
在大部分编程语言中,函数的参数都分为两种:
1、声明时的参数是形参(用于接收值)
2、调用方法的时候传递的参数是实参(用于把值传递给形参)
==但是,对于JavaScript这门弱类型语言,对函数参数的处理方面与别的强类型语言有很大不同,且灵活了很多:==
示例代码:
```javascript // 声明一个函数,形参的个数2个 function doSomething(num1, num2){ alert(num1 + ":" + num2); // num1和num2,在方法的内部可以作为普通的局部变量使用。
}
//调用函数:把 5 传递给num1, 把 "a" 传递给num2 doSomething(5, "a"); // 弹出:5:a
//调用函数:把 "a" 传递给num1, 把 “b” 传递给num2 ."c"没有形参接受。 doSomething("a", "b", "c"); //虽然比形参的个数多,但是仍然可以正常调用。
//调用函数:把 "a"传递给num1. doSomething("a"); //虽然比形参的个数少,但是仍然可以正常调用
1、在通过实参给形参传递参数的时候,如果实参的个数比形参少,则接收不到值的形参的初始化值为 undefined 的。 2、传递的实参比形参多的时候,多余的实参没有形参接受,正常情况下无法访问到传递过来的多余的实参。 3、其实多余的实参并没有丢失,函数帮我们保存在了一个变量(对象)中。这个变量的名字就是 arguments。 4、arguments不需要开发者手动创建,在调用函数的时候,会自动创建,并把传递过来的所有实参的值都保存在这个变量中。 5、可以暂时把arguments当成一个数组来理解,虽然他实际并不是一个数组。(其实是个对象,每个参数都是他的一个属性值)。 ```
arguments使用代码简单实例:
关于数组的详细使用,明天再讲。
javascript function doSomething (num1, num2) { alert(num1 === arguments[0]); //true alert(num2 === arguments[1]); // true /* 只要方法被调用,则一定会自动创建一个arguments对象,这个对象会存储传过来的所有的实参。 */ for (var i = 0; i < arguments.length; i++) { alert(arguments[i]); } } doSomething("a", "b", "c", "d");
return可以立即停止函数的运行,类似于循环结构中break关键字。return 可以给返回值,也可以不给。但不管给不给返回值,只要写return了,就立刻停止函数的运行。
```javascript /* 声明一个函数 功能:实现两个数的相加,并返回结果 num1:第一个数 num2:第二个数 */ function add(num1, num2){ //add是方法名。 num1和num2是形式参数 var sum = num1 + num2; //声明一个变量,来存储num1和num2的相加的值 return sum; //使用return语句返回结果 }
//其中函数体的代码,也可以简化一行代码 function add(num1, num2){ return num1 + num2; // 直接返回num1 + num2这个表达式。则会自动计算,并返回计算的结果 }
//利用方法名 add 去调用。 5 和 10是实参,会传递给方法声明的形参: num1和num2。 var sum = add(5, 10); //重新定义一个变量sum来接受方法的返回值。 alert(sum); //可以多次调用同一个函数,通过传入不同的参数来计算不同的值。我们定义的函数中的代码就完成了复用 alert(add(10, 20)); ```
用于函数停止
```javascript function testFn () { var a = 10; var b = 20; if (b > a) { // return b; //会返回b的值,并且中断函数的运行下面代码都不会执行。 return; //也可以不给返回值,根据自己需求而定。 }
console.log("你觉得这段代码能执行么?"); }
var maxNum = testFn(); //函数的调用,并且接受返回值给maxNum,如果函数没有返回值的话,接收后则是undefined。 console.log(maxNum); ```
函数体内也可以调用其他的函数
```javascript //函数体内,也可以调用另外一个函数 function fn1 () { // var name = fn2(); //函数内调用另外一个函数。 // return name + "刘升升"; return fn2() + "刘shengsheng"; }
function fn2 () { return "给fn1函数提供的数据!"; }
var str = fn1(); //想执行以上代码,必须要先调用fn1函数。 console.log(str); ```
变量的作用域指的是,变量起作用的范围。也就是能访问到变量的有效范围。
JavaScript的变量依据作用域的范围可以分为:
- 全局变量
- 局部变量
==定义在函数外部的变量都是全局变量。==
全局变量的作用域是==当前文档==,也就是当前文档所有的JavaScript脚本都可以访问到这个变量。
下面的代码是书写在同一个HTML文档中的2个JavaScript脚本
运行这段代码并不会报错, alert(a); 这行代码弹出:undefined。
为什么在声明 a 之前可以访问变量 a 呢? 能访问 a 为什么输出是undefined而不是20呢?
==声明提前!==
在函数内声明的变量,叫局部变量!表示形参的变量也是局部变量!
局部变量的作用域是局部变量所在的整个函数的内部。 在函数的外部不能访问局部变量。
在方法内部访问m,访问到的是哪个m呢?局部变量的m还是全局变量的m?
代码1输出什么? undefined还是10?还是报错?
==输出10!==
在上面的代码中,变量 n 虽然是在 if 语句内声明的,但是它仍然是全局变量,而不是局部变量。
只有定义在方法内部的变量才是局部变量
注意:
匿名函数是指没有函数名的函数。
说明:
可以通过匿名函数完成某些一次性的任务。
如果一个函数不需要重复执行,则可以定义一个匿名函数
有些场景,我们需要定义完函数之后立即执行,这个时候可以定义一个匿名函数来完成。
javascript (function () { alert("匿名函数立即执行") })();
说明
重载在通常的面向对象语言中这样定义:
- 方法名相同
- 参数列表不同
满足这两个条件的函数就构成重载。
在JavaScript中,如果两个函数的名字相同,那么后定义的函数会覆盖先定义的函数。
所以,==JavaScript不能完成通常意义的重载!JavaScript不支持重载==
虽然JavaScript不支持重载,但是我们可以通过一定的手动模拟出重载
递归调用是指的,在函数的内部调用当前函数。即自己调用自己。
使用递归一定要满足下面条件,否则很容易出现死循环。