05 函数(下)

117 阅读3分钟

变量作用域(重点)

  • 什么是作用域,就是一个变量可以生效的范围
  • 变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域

全局作用域

  • 全局作用域是最大的作用域
  • 在全局作用域中定义的变量可以在任何地方使用
  • 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window
  • 这个作用域会一直存在,直到页面关闭就销毁了
<script>
        var num = 100 //全局作用域
        var age = 20 //全局作用域
</script>

局部作用域

  • 局部作用域就是在全局作用域下面又开辟出来的一个相对小一些的作用域
  • 在局部作用域中定义的变量只能在这个局部作用域内部使用
  • 在 JS 中只有函数能生成一个局部作用域,别的都不行
  • 每一个函数,都是一个局部作用域
<script>
        var num = 100 // 全局作用域

        function fn() {

            var num1 = 200 // fn函数,局部作用域

            function fun() {
                var num2 = 300   // fun函数,局部作用域
                console.log(num1)
                console.log(num2)
            }
        }
        fun()
    </script>
  • 有了作用域以后,变量就有了使用范围,也就有了使用规则
  • 变量使用规则分为两种,访问规则 和 赋值规则

作用域链

变量访问或赋值时, 先在自己的作用域查找, 如果没找到,再一层一层向上查找,至到最外层全局作用域。 这种层层查找关系,叫作用域链

递归函数

函数定义好之后,不能自已执行,需要使用函数调用语句调用才会执行, 函数调用语句一般写在函数体外面,但如果将函数调用语句写在函数体中, 也就是在一个函数内部,调用自己,这种函数称为递归函数:

//下面这个代码就是一个最简单的递归函数
        //在函数内部调用了自己,函数一执行,就调用自己一次
        function fn() {
            fn()
        }
        fn()

上面递归函数 一旦执行,会循环往复,没有止尽。 需要给递归函数设置递归结束条件。 不然就是一个没有尽头的递归函数,我们叫做 死递归

 function fn() {
            //递归结束条件
            if (n == 1) {
                return 1
            }
            return fn(n - 1)
        }
        fn(3)

递归实现(重点)

解决问题: 后面的结果,是由前面推导的

实现递归
 1. 函数自身调用自身
        function fn(){
              fn()
          }
 2. 结束递归条件
        function fn(n){
            if(n == 1){
                return 1
            }
        }
 3. 前后关系,后面结果与前面值关系
        例如:
          1 + 2 + 3 + 4 + 5 = ?
               
           f(5) = f(4)+5↑
                 => f(3)+4↑
                    => f(2)+3 ↑
                       => f(1)+21f(n) = f(n-1) + n 

简单了解对象

对象引入

现实生活
              对象
                => 具体一个事物
                      张三        李四
                      x100手机   pm001手机
                     区别: 
                       行为  特征
软件世界
              对象
                   特征: 属性
                   行为: 方法

简单对象创建方式 两种

     //  1.字面量方式
        var obj = {} //创建空对象
        obj.name = '张三丰' // 将'张三丰'赋值给对象obj的name属性
        // {name:'张三丰'}
        obj.age = 101 // {name:'张三丰',age:101}

        var obj = {
            name: '张三丰',
            age: 101
        }
        //   2.构造函数的方式创建对象
        var obj = new Object()
        obj.name = '张三'
        obj.age = 22

数据类型 - 复杂数据类型Object

访问对象属性

对象.属性名
var obj = {name:'jack'}
obj.name