js基础第五天

129 阅读5分钟

函数

1.函数介绍

1.函数

①function(执行特定任务的代码块 )

2.说明

① 精简代码方便复用。

②可以实现代码复用,提高开发效率

2.函数运用

1.函数声明语法

function 函数名(){
    函数体
}

2.函数命名规范

①和变量命名基本一致

②尽量小驼峰式命名法

③前缀应该为动词

④命名建议:常用动词约定

3.语法:

function getName(){}
function addSquares(){}

4.动词

①can (判断是否可执行某个动作)

②has (判断是否含义某个值)

③is (判断是否为某个值)

④get (获取某个值)

⑤set (设置某个值)

⑥load (加载某些数据)

5.案例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 函数的声明
        function sayHi() {
            console.log('你好');
            console.log('你最好');
            console.log('你真棒');
        }

        // 函数调用
        sayHi();
        sayHi();
    </script>
</body>
</html>

6.总结

1.函数不调用会执行吗?如何调用函数?

①函数不调用自己不执行

②调用方式: 函数名()

2.函数的复用代码和循环重复代码有什么不同?

①循环代码写完即执行,不能很方便控制执行位置

② 随时调用,随时执行,可重复调用

3.形参和实参

1.形参

①声明函数时写在函数名右边小括号里的叫形参(形式上的参数)

②形参可以理解为是在这个函数内声明的变量(比如 num1 = 10)实参可以理解为是给这个变量赋值

③开发中尽量保持形参和实参个数一致

④我们曾经使用过的 alert('打印'), parseInt('11'), Number('11') 本质上都是函数调用的传参

2.实参

①调用函数时写在函数名右边小括号里的叫实参(实际上的参数)

3.语法

function getSun(num1,num2){    //num1 num2形参 
    document.write(num1 + num2)
}
getSun(1o,20)     //10,20实参

4.案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>09-函数和参数.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // // 函数的声明
      // function sayHi(a) {
      //   a = '大家好';
      //   // a="海贼王";
      //   // a 用来代表这 外部会传入尽量的 一个数据 而已  别名  这个家伙
      //   console.log(a);
      // }
      // // 函数的调用 + 传参
      // // sayHi('你好');

      // sayHi('大家好');

      // let userName = '海贼王';
      // sayHi(userName);

      // 希望有一个函数 可以自动针对传入的 数组 来求和
      function calcSum(a) {
        // 默认a就是一个数组 =[1,2,3]  [4,5,6]
        let sum = 0;
        for (let index = 0; index < a.length; index++) {
          sum += a[index];
        }
        console.log(sum);
      }

      // 实参和形参有几个

      // 函数调用的时候,括号里面有几个数据 就是几个参数
      calcSum([1, 2, 3, 4]);
      calcSum([1, 33, 23, 43]);
    </script>
  </body>
</html>

5.总结

1.函数传递参数的好处是?

①②可以极大的提高了函数的灵活性

2.函数参数可以分为那两类?怎么判断他们是那种参数?

① 函数可以分为形参和实参

② 函数声明时,小括号里面的是形参,形式上的参数

③ 函数调用时,小括号里面的是实参,实际的参数

④尽量保持形参和实参的个数一致

3.参数中间用什么符号隔开?

①逗号

4.函数返回值

1.return(返回数据)

①当函数需要返回数据出去时,用return关键字

②函数执行后得到结果,结果是调用者想要拿到的(函数内部不需要输出结果,而是返回结果)

2.语法

function getSun(x,y){
    return x + y
}
let num = getSun(10,30)
document.write(num)

3.注意

①在函数体中使用 return 关键字能将内部的执行结果交给函数外部使用

②函数内部只能出现 1 次 return,并且 return 后面代码不会再被执行,第一个return生效, 所以 return 后面的数据不要换行写

③ return会立即结束当前函数

④ 函数可以没有 return,这种情况函数默认返回值为 undefined

4.案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>14-函数的返回值.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // function getMax() {}

      // function getSum() {}

      // // 这个num1 就是  函数getMax调用的返回值 ( num1 = 1 2 。。)

      // // let num2 = getSum();

      // let num1 = getMax();// 我们自己写的函数 只能返回 undefined
      // let num3 = parseInt(1.3);// js自己内部写的 返回值  1

      // console.log(num3); //

      function getMax() {
        // 100 就是 函数在执行完毕的时候 会返回的数据
        return 300;
      }

      let num1 = getMax(); // num1 =100

      console.log(num1);
    </script>
  </body>
</html>

5.作用域

1.作用域概述

①一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这

个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突。

2.全局作用域

①全局有效

②作用于所有代码执行的 环境(整个 script 标签 内部)或者一个独立的 js 文件

3.局部作用域

①局部有效

②作用于函数内的代码环境,就是局部作用域。 因为跟函数有关系,所 以也称为函数作用域。

4.块级作用域

①{} 内有效

②块作用域由 { } 包括 , if 语句和 for 语句里面的{ }等

6.变量作用域

1.全局变量

①函数外部let 的变量

2.局部变量

①函数内部let的变量

②局部变量只能在当前函数内部访问和修改

案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>20-局部变量.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // 局部变量
      // 如果是在函数内部定义的变量 就叫做局部变量
      // 局部变量 不能在 它的大括号之外使用的,否则就会报错!! 
      
      let msg = 10000; // 全局变量

      // 局部变量  函数内部 声明的变量
      function getMax() {
        // 声明一个数字
        let num = 200; // 局部变量
      }


      // 局部变量 不能在 超出它的大括号来使用
      console.log(num); // 会报错 
    </script>
  </body>
</html>

3.块级变量

①{} 内部的let变量

②let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问

案例

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>21-块级变量.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // 块级变量 就是我们在块级作用域内 定义的变量
      // 块级变量 类似局部变量,也是超出了自身的大括号 不能使用

       for (let index = 0; index < 2; index++) {
      //   // num 块级变量 
        let num = 100;
      // }
      // console.log(num);// 使用块级变量  出错!! 


       {
         let num =10;
       }
       {
        console.log(num);
      }

      /* 
      小结
      1 分类     分成两类即可  
      1 全局变量
        直接放在 script标签内的变量
      2 局部变量 用大括号包起来的变量
        1 函数内部变量
        2 块级变量 
      
       */
    </script>
  </body>
</html>

4.作用域特殊情况

1.如果函数内部或者块级作用域内部,变量没有声明,直接赋值,也当全局变量看,但是强烈不推荐

但是有一种情况,函数内部的形参可以看做是局部变量。

7.作用域链

1.作用域链

只是代码寻找变量的一种机制,规定 就近原则

①先找自己的作用域 num, (没找到)

②往外部(父级)的作用域来找 (没找到)

③继续往外部 (父级)来找

④直到找到 全局作用域 就停止下来

2.案例测试

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>27-作用域链-测试.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // let num = 100;
      // function func1() {
      //   let num = 200;
      //   fun2();
      // }

      // function fun2() {
      //   let num = 300;
      //   console.log(num); // 300
      // }

      // func1();

      // 判断当前变量 输出是什么  
      // 就近原则   判断是要根据 函数的定义 来判断 而不是函数的调用 
      // 函数的定义 代码位置来判断  100  这个!! 
   

      let num = 100;
      function func1() {
        let num = 200;
        // 函数的调用 
        fun2();
      }

   

      // 函数的定义-声明 
      function fun2() {
        console.log(num);
      }

      func1();
    </script>
  </body>
</html>

8. 匿名函数

1.具名函数

①声明:function fn() {}

②调用:fn()

2.匿名函数

①function() {}

1.作用:

①避免全局变量之间的污染

②执行一次性的认为

2.语法:

//方法1
(function(){ console.log(11)})();
//方法2
(function(){ console.log(11)}());
//不需要调用,立即执行
//注意:多个立即执行函数之间用 分号 隔开,不然会报错

3.案例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0,maximum-scale=1,minimum-scale=1,user-scalable=no"
    />
    <title>30-匿名函数-了解.html</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
    </style>
  </head>
  <body>
    <script>
      // 函数按照有没有名字 分成两种
      // 有名字 具名函数
      // 没有名字 匿名函数

      // 具名函数  函数名称  func1
      // function func1() {
      // }

      // 匿名函数  = function () {}; 匿名函数 了解即可 

      //    let func2 = function () {};  叫做 函数表达式 
      // 表达式 可以表示结果的一段代码  函数表达式  了解 
      let func2 = function () {
        console.log("123");
      };


      // 调用
      func2();
    </script>
  </body>
</html>