函数(下)

61 阅读4分钟

变量作用域

变量作用域

  1. 什么是作用域,就是一个变量可以生效的范围

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

  2. 全局作用域

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

    <script>
        var num = 100 //全局作用域
        var age = 22 //全局作用域
    </script>
    
  3. 局部作用域

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

    <script >
    var num = 100 //全局作用域
    
    function fn() {
        var num1 = 200 // fn函数,局部作用域
        function fun() {
            var num2 = 300 // fun函数,局部作用域
            console.log(num1)
            console.log(num2)
            fun()
        }
        fn() 
    }
    

变量使用规则

  1. 访问规则

变量的访问规则也叫做作用域的查找机制作用域的查找机制只能是向上找,不能向下找

  • 首先,在自己的作用域内部查找,如果有,就直接拿来使用

  • 如果没有,就去上-级作用域查找,如果有,就拿来使用

  • 如果没有,就继续去上一级作用域查找,依次类推

  • 如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量is not defined)

    var num = 100
    function fn() {
        var nun2 = 200
        function fun() {
            var num3 = 300
            console.log(num3) //自己作用域内有,拿过来用
            console.1og(num2) //自己作用域内没有,就去上一级,就是fn的作用域里面找,发现有,拿过来用
            console.log(num) //自己这没有,去上一级fn那里也没有,再上一级到全局作用域,发现有,直接用
            console.1og(a) //自己没有,逐级找上去到全局都没有,就会报错
        }
        fun()
    }
    fn()
    
  1. 赋值规则
  • 先在自己作用域内部查找,有就直接赋值

  • 没有就去上一级作用域内部查找,有就直接赋值

  • 在没有再去上一级作用域查找,有就直接赋值

  • 如果一直找到全局作用域都没有,那么就把这个变量定义为全局变量,在给他赋值

    function fn() {
        num = 100
    }
    fn()
    
    console.1og(num) // 100
    

作用域链

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

递归函数

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

     //在函数内部调用了自己,函数一执行,就调用自己一次,
     function fn() {
         fn()
     }
     fn()
    
  2. 上面递归函数一旦执行,会循环往复,没有止尽。需要给递归函数设置递归结束条件。不然就是一个没有尽头的递归函数,叫做死递归

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

QQ截图20220819115719.png 4. 递归实现

函数自身调用自身

function fn(){
fn()

结束递归条件

function fn(n){
if(n == 1){
return 1
}

前后关系,后面结果与前面值关系

例如:1+2+3+4+5=?

f(5)= f(4)+5↑
=> f(3)+4↑
=> f(2)+3↑
=> f(1)+21f(n)= f(n-1) + n

对象

对象 Object

属性 方法

属性名:属性值构成

创建对象方式

  1. 字面量方式

     varobj = {} //创建空对象
     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 = 33
    
  3. 遍历对象

     for-in for(var key in obj){ 
     //key = 'name' key = 'age' ... 
     console.log('key ', key, ' value ', obj[key]) } 
    
  4. 访问属性值,属性名是变量情况

     console.log( 'name ', obj.name) 
     var _name = 'name' 
     console.log(obj[_name]) 
     console.log(obj['name'])
    

数组

  1. 作用: 存储一系列有序数据的集合

  2. 创建数组

     var arr = [] //创建空数组 
     var arr = [1,2,'jack',true] 
                0 1    2    4 
    
  3. 索引号(下标)

  4. 访问数组元素

     arr[0] 
    
  5. 数组长度 (元素个数)

     length属性
     arr.length 
    
  6. 遍历数组

     for (var i = 0; i < arr.length; i++) { 
         console.log(arr[i]) 
     }
    
  7. 创建数组方式

     //构造函数
     var arr = newArray() //空数组 
     
     //字面量
     var arr = [] //空数组
    
  8. 创建数组只有一个元素, 表示创建一个空数组长度是5 length=5

     var arr2 = newArray(5) 
     console.log('arr2.length >>> ', arr2.length) 
     for (var i = 0; i < arr2.length; i++) { 
         console.log(arr2[i])
     }