就是封装了一段可被重复调用执行的代码块。通过此代码块可以实现大量代码的重复使用。

1.函数的使用

函数在使用时分为两步:声明函数调用函数

1.1声明函数

function 是声明函数的关键字,必须小写

  1. //声明函数
  2. function 函数名(){
  3. //函数体代码
  4. }

声明函数本身并不会执行代码,只有调用函数时才会执行函数体代码。

1.2调用函数

  1. //调用函数
  2. 函数名(); //通过调用函数名来执行函数体代码

2.函数的封装

函数的封装是把一个或者多个功能通过函数的方式封装起来,对外只提供一个简单的函数接口

3.函数的参数

3.1形参和实参

在声明函数时,可以在函数名称后面的小括号中添加一些参数,这些参数被称为形参,而在调用该函数时,同样也需要传递相应的参数,这些参数被称为实参

参数 说明
形参 式上的函数定义的时候 传递的参数 当前并不知道是什么
实参 际上的函数调用的时候 传递的参数 实参是传递给形参的

3.2形参和实参个数不匹配

参数个数 说明
实参个数等于形参个数 输出正确结果
实参个数多于形参个数 只取到形参的个数
实参个数小于形参个数 多的形参定义为undefined,结果为NaN
  1. function sum(num1, num2) {
  2. console.log(num1 + num2);
  3. }
  4. sum(100, 200); // 300,形参和实参个数相等,输出正确结果
  5. sum(100, 400, 500, 700); // 500,实参个数多于形参,只取到形参的个数
  6. sum(200);

注意:在JavaScript中,形参的默认值是undefined

4.函数的返回值

4.1return语句

有的时候,我们会希望函数将值返回给调用者,此时通过使用 return 语句就可以实现。

  1. // 声明函数
  2. function 函数名(){
  3. ...
  4. return 需要返回的值;
  5. }
  6. // 调用函数
  7. 函数名(); // 此时调用函数就可以得到函数体内return 后面的值
  • 在使用 return 语句时,函数会停止执行,并返回指定的值
  • 如果函数没有 return ,返回的值是 undefined


4.2return 终止函数

return 语句之后的代码不被执行

  1. function add(num1,num2){
  2. //函数体
  3. return num1 + num2; // 注意:return 后的代码不执行
  4. console.log('我不会被执行,因为前面有 return');
  5. }
  6. var resNum = add(6,6); // 调用函数,传入两个实参,并通过 resNum 接收函数返回值
  7. console.log(resNum)

4.3return 的返回值

return 只能返回一个值。如果用逗号隔开多个值,以最后一个为准

  1. function add(num1,num2){
  2. //函数体
  3. return num1,num2;
  4. }
  5. var resNum = add(1,6); // 调用函数,传入两个实参,并通过 resNum 接收函数返回值
  6. console.log(resNum); // 6

4.4总结

函数都是有返回值的

  1. 如果有 return ,则返回 return 后面的值
  2. 如果没有 return,则返回 undefined

5.arguments

当我们不确定有多少个参数传递的时候,可以用 arguments 来获取。在 JavaScript 中,arguments 实际上它是当前函数的一个内置对象。所有函数都内置了一个 arguments 对象,arguments 对象中存储了传递的所有实参。

  1. // 函数声明
  2. function fn() {
  3. console.log(arguments); //里面存储了所有传递过来的实参
  4. console.log(arguments.length); // 3
  5. console.log(arguments[1]); // 2
  6. }
  7. // 函数调用
  8. fn(1,2,3);

6.函数的两种声明方式

6.1自定义函数方式(命名函数)

利用函数关键字 function 自定义函数方式。

  1. // 声明定义方式
  2. function fn() {...}
  3. // 调用
  4. fn();
  1. 因为有名字,所以也被称为命名函数
  2. 调用函数的代码既可以放到声明函数的前面,也可以放在声明函数的后面

    6.2函数表达式方式(匿名函数)

    ```javascript // 这是函数表达式写法,匿名函数后面跟分号结束 var fn = function(){…};

// 调用的方式,函数调用必须写到函数体下面 fn();

  1. - 因为函数没有名字,所以也称为**匿名函数**
  2. - 这个fn 里面存储的是一个函数
  3. - **函数调用的代码必须写到函数体后面**
  4. <br />
  5. <a name="KgQ9z"></a>
  6. # 7.作用域
  7. 通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的**可用性的代码范围**就是这个名字的**作用域**。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。<br />JavaScript (ES6前) 中的作用域有两种:
  8. - 全局作用域
  9. - 局部作用域(函数作用域)
  10. <a name="g4keu"></a>
  11. ## 7.1全局作用域
  12. 作用于所有代码执行的环境(整个 script 标签内部)或者一个独立的 js 文件
  13. <a name="idR5K"></a>
  14. ## 7.2局部(函数)作用域
  15. 作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所以也称为函数作用域
  16. <a name="nBW7E"></a>
  17. ## 7.3JS 没有块级作用域
  18. 块作用域由 {} 包括<br />在其他编程语言中(如 javac#等),在 if 语句、循环语句中创建的变量,仅仅只能在本 if 语句。
  19. ```javascript
  20. if(true){
  21. var num = 123;
  22. console.log(num); // 123
  23. }
  24. console.log(num); //123
  1. if(true){
  2. let num = 123;
  3. console.log(num); // 123
  4. }
  5. console.log(num); //报错

8.变量的作用域

在JavaScript中,根据作用域的不同,变量可以分为两种:

  • 全局变量
  • 局部变量

    8.1全局变量

    在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量

  • 全局变量在代码的任何位置都可以使用

  • 在全局作用域下 var 声明的变量 是全局变量
  • 特殊情况下,在函数内不使用 var 声明的变量也是全局变量(不建议使用)


    8.2局部变量

    在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量

  • 局部变量只能在该函数内部使用

  • 在函数内部 var 声明的变量是局部变量
  • 函数的形参实际上就是局部变量

    9.作用域链

  1. 只要是代码,就至少有一个作用域
  2. 写在函数内部的叫局部作用域
  3. 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域
  4. 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链 ```javascript // 作用域链: 内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值

var num = 10; funtion fn() { //外部函数 var num = 20;

  1. function fun() { //内部函数
  2. console.log(num); // 20 ,一级一级访问
  3. }

}

  1. 作用域链:采取**就近原则**的方式来查找变量最终的值。
  2. <a name="q3sTw"></a>
  3. # 10.预解析
  4. ```javascript
  5. console.log(num);
  6. //会报错
  1. console.log(num);
  2. var num = 10;
  3. // undefined
  1. // 命名函数(自定义函数方式):若我们把函数调用放在函数声明上面
  2. fn(); //11
  3. function fn() {
  4. console.log('11');
  5. }
  1. // 命名函数
  2. fn(); //10
  3. function fn() {
  4. console.log('10');
  5. }
  1. // 匿名函数
  2. fn();
  3. var fn = function() {
  4. console.log('10'); // 报错
  5. }

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析和代码执行。

  • 预解析:js引擎会把js里面所有的 var 还有 function 提升到当前作用域的最前面
  • 代码执行:从上到下执行JS语句

10.1变量预解析(变量提升)

变量提升: 变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升

  1. console.log(num);
  2. var num = 10;
  3. // undefined
  4. //相当于执行了以下代码
  5. var num; // 变量声明提升到当前作用域最上面
  6. console.log(num);
  7. num = 10; // 变量的赋值不会提升

10.2函数预解析(函数提升)

函数提升: 函数的声明会被提升到当前作用域的最上面,但是不会调用函数。

  1. fn(); //10
  2. function fn() {
  3. console.log('10');
  4. }

10.3解决函数表达式声明调用问题

对于函数表达式声明调用需要记住:函数表达式调用必须写在函数声明的下面

  1. // 匿名函数
  2. fn();
  3. var fn = function() {
  4. console.log('10'); // 报错
  5. }
  6. var fn = function() {
  7. console.log('10');
  8. }
  9. fn(); //10