5、函数(下)

51 阅读5分钟

变量作用域(重点)

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

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

  • 全局作用域

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

    图像 (3).png

  • 局部作用域

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

    图像 (4).png

  • 有了作用域以后,变量就有了使用范围,也就有了使用规则 变量使用规则分为两种,访问规则 和 赋值规则

变量使用规则(重点)

访问规则

即获取变量值规则

图像 (5).png

图像 (6).png

赋值规则

图像 (7).png

作用域链(面试题)

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

递归函数

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

图像 (8).png

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

图像 (9).png

3、示例

 1、求 15 的和   1 + 2 + 3 + 4 + 5 = ?
        function sum(n){
            if(n==1){
                return 1
            }
            return sum(n-1)+n
        }
        sum(5)

4、运行原理 图像 (10).png 5、递归实现(重点)

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

    QQ截图20220819195335.jpg

6、练习

1、入职薪水10K/月,每年涨幅5%,50年后工资多少?
        document.write('---9、入职薪水10K/月,每年涨幅5%,50年后工资多少?---' + '<br>')
        function salary(n) {
            for (var year = 2; year < 51; year++) {
                n = n + n * 0.05
            }
            document.write('50年后的工资是' + n.toFixed(2) + '元'+'<br>')
            document.write('<br>')
        }
        salary(120000)
  
2. 求斐波那契数列中第8个数? 例:斐波纳契数列。
        前两个数都是1,第三个数是前两个数之和,以后的每个数都是其前两个数之和。
         1  1  2  3  5  8  13  21  34  55 */
         function get(x){
            var a=0
            var b=1
            var c=1
            var count=1
            for(var i=1;i<15;i++){
                c=a+b
                a=b
                b=c
                count++
                if (count%x==0){
                    document.write(c+' ')
                    return
                }
            }
         }
         get(8)

对象

一、理解对象
       => 面向对象
       => 现实生活中对象
           具体一个事物
            张三同学
           对象有自己的特征行为
             
       => 软件世界
            对象 Object
            属性  方法
            属性名:属性值构成

      二、创建对象
        var jackObj = {}  //创建空对象
        var jackObj = {
            name:'jack',   //姓名属性 => name属性名和jack属性值构成
            age:18,  // 年龄属性 => age属性名和18属性值构成
            sex:'男' // 性别属性 
        }  

      三、数据类型
        基本数据类型 
            var num = 100 // number
            var name = 'jack' //string
            ...
        复杂数据类型
         var obj = {name:'jakc',age:18}
         obj 数据类型名 -> Object

      四、创建对象-new语句
        字面量方式
            var obj = {
                name:'jack',
                age:18
            } 

        构造函数方式
            var obj = new Object()  //空对象
            obj.name = 'jack',
            obj.age = 18
            
      五、 遍历对象 for-in
示例
    // 创建一个姓名是jack,年龄是18岁,性别是男的对象
    // obj称为对象名, 也可以叫引用变量
    // 通过对象名访问对象属性  对象名.属性名 ->属性值

    // 1、创建对象
    var obj = {
        name: 'jack',
        age: 18,
        sex: '男'
    }

    // 2. 访问属性的值
    console.log('name:', obj.name)
    console.log('age:', obj.age)
    console.log('sex', obj.sex)

    // 3. 修改属性值
    obj.name = 'rose'
    console.log('name:', obj.name)
    console.log(obj)

    // 4. 删除属性
    // delete obj.name
    console.log(obj)

    // 5. 添加属性
    obj.score = 98
    console.log(obj);

    // 6. 遍历对象 for-in 
    for (var key in obj) {
        // key = 'name'  key='age' ...
        console.log('key:', key, 'value:', obj[key])
    }

    // 7. 访问属性值,属性名是变量情况
    console.log( 'name ',obj.name)
    var _name = 'name'
    console.log(obj[_name])
    console.log(obj['name'])
  练习
    /*
      创建一个名为student的学生对象,有属性学号num,性别sex,班级grade, 成绩score, 姓名name
    */
		var student = {
			num: '01',
			sex: '女',
			grade: '1',
			score: 55,
			name: '小张',
		}
                    //此处设的变量xx代表对象中的属性,一般定义为key
		for (var xx in student) {
			console.log('key ', xx, ' value ', student[xx])
			console.log(xx)
		}

		student.age = 22

		console.log(student)

数组

复杂数据类型
      Object  
        var obj = {
            name:'jack',
            age:18
        }

       作用: key/value -> 键/值对的集合
     
     数组 Array
       数组
       1. 作用: 存储一系列有序数据的集合
       2. 创建数组
        var arr = []  //创建空数组
        var arr = [1,2,'jack',true]
                   0 1   2     3
       3. 索引号(下标)
       4. 访问数组元素
          arr[0]
       5. 数组长度 (元素个数)
           length属性
           arr.length 
       6. 遍历数组
           for

       7. 创建数组方式
          构造函数
            var arr = new Array()  空数组  
          字面量 
            var arr = []   空数组 
练习
    //1. 创建数组
        var arr=[10,20,30,40]
           // 0  1  2  3
    //2. 访问数组元素
        console.log('arr[0] :', arr[0], ' arr[1] :', arr[1])
    //3. 数组长度
        console.log('length >> :', arr.length)
    //4. 遍历数组, 循环变量表示数组索引号从0开始
        for (var i = 0; i < arr.length; i++) {
			console.log(arr[i])
		}
    // 5. 构造函数创建数组
        var arr1 = new Array(100, 200, 300, 400, 500)
		for (var i = 0; i < arr1.length; i++) {
			console.log(arr1[i])
		}
     // 6. 创建数组只有一个元素, 表示创建一个空数组长度是5 length=5
		var arr2 = new Array(5)
		console.log('arr2.length >>> ', arr2.length)
		for (var i = 0; i < arr2.length; i++) {
			console.log(arr2[i])
		}

    // 7. 直接控制台打印
        console.log(arr);
   

练习

一、 1. 创建一个学生成绩数组,存储所有学生的数学成绩,分别是 89,78,90,99,67,59
2. 求所有学生中分数最高的学生成绩,打印输出到界面
3. 求不及格的学生有几个,打印输出到界面
     // 1. 创建一个学生成绩数组,存储所有学生的数学成绩,分别是 89,78,90,99,67,59
		var scoreArr = [89, 78, 90, 92, 47, 59, 98]
    // 2. 求所有学生中分数最高的学生成绩,打印输出到界面
		// 假设第一个数是最大值
		var max = scoreArr[0]
		// 依次让后面的数与最大值max比较,如果大于max,赋值给max
		// 从数组第二个元素开始循环遍历数组,进行求最大值比较
		for (var i = 1; i < scoreArr.length; i++) {
			if (scoreArr[i] > max) {
				max = scoreArr[i]
			}
		}
		console.log('最大值 ', max)
    // 3. 求不及格的学生有几个,打印输出到界面
        // 分析: 遍历学生成绩数组, 与60比较,如果小60不及格,计数器加一
		var count = 0 //计数
		for (var i = 0; i < scoreArr.length; i++) {
			if (scoreArr[i] < 60) {
				count++
			}
		}
        console.log('不及格人数是 ',count)
二、现有5名学生,语文成绩分别是9887958977分
    请定义一个成绩数组存储学生成绩并遍历输出
    求5名学生总成绩?
    求大于平均分的学生成绩?
    有一个存储两个数的数组[3,6]写程序交换数组元素,输出[6,3] 
    
    var arr = [98, 87, 95, 89, 77]
    function printArr() {
        for (var i = 0; i < arr.length; i++) {
            console.log(arr[i])
        }
    }
    printArr()
    //总成绩
    function getTotalScore() {
			var total = 0
			for (var i = 0; i < arr.length; i++) {
				total += arr[i]
			}
			console.log('总成绩是 ', total)
			return total
		}
	var total = getTotalScore()
    //平均分
    var avg = total / arr.length
	console.log('平均分 ', parseInt(avg))
    //大于平均分成绩
		for (var i = 0; i < arr.length; i++) {
			if (arr[i] > avg) {
				console.log(arr[i])
			}
		}
    // 有一个存储两个数的数组[3,6]写程序交换数组元素,输出[6,3]
		function swap() {
			var arr1 = [3, 6]
			console.log(arr1)    // arr1[0] :3  arr1[1]: 6
			var temp = arr1[0]   // 留位置交换
			arr1[0] = arr1[1]
			arr1[1] = temp
  			console.log(arr1)
		}
               swap()