JavaScript学习笔记05

一、变量作用域(重点)

        作用域:变量起作用的范围。分为全局作用域局部作用域

        全局作用域:最大的作用域。在全局作用域中定义的变量可以在任何地方使用。

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

<body>
    <script>
        var num=100 //全局作用域
        function fn(){
            var num1=100 //定义在函数体内,局部作用域
            console.log('num1',num1);
        }
        console.log('num1',num1);//Uncaught ReferenceError: num1 is not defined
        fn()
        
    </script>
</body>

二、变量使用规则(重点)

        1.访问规则,即获取变量值规则。

<body>
    <script>
        var num=100
        function fn(){
            var num1=200
            console.log('fn num',num);
            function fun(){
                var num2=300
                console.log('fun num',num); //当前没有,上一级没有,再上一级到全局作用域,有,拿来用
                console.log('fun num1',num1); //当前作用域没有,到上一级查找
                console.log('fun num2',num2); // 当前作用域
                console.log(num3); //自己没有,一级一级找上去到全局作用域也没有,报错
            }
            fun()
        }
        fn()
    </script>
</body>

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

        2.赋值规则

<body>
    <script>
        var num = 100
        // var num3
        function fun1() {
            var num1 = 200  
            function fun2() {
                var num2 = 300 //赋值前在当前作用域查找
                num1 = 400 // 上级作用域查找,找到赋值
                num = 500 //上级作用域查找,至到全局作用域
                num3 = 600 // 当前作用域查找,上级作用域查找,全局作用域查找,全局作用域也没查找到,将创建全局变量,然后赋值
                console.log('num3 ',num3);
            }
            fun2()
        }
        fun1()
    </script>
</body>

三、作用域链

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

四、递归函数(重点)

        递归函数:函数自身调用自身,这样的函数就叫递归函数。

        需要给递归函数设置递归结束条件, 不然就是一个没有尽头的递归函数,我们叫做死递归。还需要有改变自身的代码。

        递归可以解决的问题:后面结果由前面推导出来,可以采用递归简化实现。

<body>
    <script>
        function fun(n){
            if(n==1){
                return
            }
            console.log('fun ',n)
            fun(n--)
        }
        fun(2)
    </script>
</body>

        实例1:求1*2*3*4*5的乘积

<body>
/*
    1*2*3*4*5=?
    分析:
    f(5)
        f(4)*5  ↑
            f(3)*4  ↑
                f(2)*3  ↑
                    f(1)*2  ↑
                        1
                f(n)=f(n-1)*n
*/
    <script>
        function fun(n){
            if(n==1){
                return 1
            }
            return fun(n-1)*n
        }
        var m=fun(4)
        console.log('积 ',m)
    </script>
</body>

        实例2:斐波拉契数列

<body>
    <script>
        /*1 1 2 3 5 8 13 21...*/
        //第n项是多少
        // function Fib(n){
        //     var a=1
        //     var b=1
        //     var c=1
        //     if(n<3){
        //         c=1
        //     }
        //     for(var i=3;i<=n;i++){
        //         return Fib(n-1)+Fib(n-2)
        //     }
        //     return c
        // }
        // document.write(Fib(8))

        // 前n项之和
        function fibo(n){
            var a=1
            var b=1
            var s
            if(n<3){
                s=1
            }
            for(var i=3;i<=n;i++){
                s = fibo(i-1)+fibo(i-2)
            }
            return s
        }
        document.write(fibo(5))
        document.write('<br>')
        var sum=0
        for(var j=1;j<=5;j++){
            sum += fibo(j)
        }
        document.write('前5项之和为',sum)
    </script>
</body>

五、对象

        现实生活中对象:
                具体一个事物
                对象有自己的特征行为
        软件世界:
                对象   Object
                属性    方法

         对象是复杂数据类型Object。

        简单创建数据变量的两种方式:

        1.字面量方式

var obj = {
      name:'jack',
      age:18
}

        2.构造函数的方式创建对象

var obj = new Object()  //空对象
obj.name = 'jack',
obj.age = 18

        访问对象属性:

        1.对象.属性名

var obj = {name:'jack'}
obj.name

        2.通过[]访问

obj['name']
var _name = 'name'
obj[_name]  //属性名为变量

        对象的基本操作:增加属性、修改属性、查询访问属性值。

<body>
    <script>
        //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){
            console.log('key ',key,' value ',obj[key])
        }

        //7.访问属性值,属性名是变量情况
        console.log('name ',obj.name)
        var _name = 'name'
        console.log(obj[_name])
        console.log(obj['name'])
    </script>
</body>

六、数组基础

        数组是一系列有序数据的集合。在 [ ] 里面存储着各种各样的数据,按照顺序依次排好。

        数组数据类型:

        1.基本数据类型:number / string / boolean / undefined / null

        2.复杂数据类型: Object / Function  /  Array / ...

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

    </script>
</body>

        length 表示数组的长度,数组里面有多少个成员,length 就是多少 。

        索引,也叫做下标,是指一个数据在数组里面排在第几个的位置。在所有的语言里面,索引都是从 0 开始的。

        因为数组的索引可以获取数组中的内容,数组的索引又是按照 0~n 顺序排列,我们就可以使用 for 循环来循环数组,因为for循环也可以设置成 0~n 的顺序增加,我们把这个行为叫做遍历

七、练习

        1.创建班级对象

<body>
    <script>
        //字面量方式
        var student={
            num:'6',
            sex:'女',
            grade:'2208',
            score:'A',
            name:'Amy'
        }
        // console.log('学号:',student.num);
        // console.log('性别:',student.sex);
        // console.log('班级:',student.grade);
        // console.log('成绩:',student.score);
        // console.log('姓名:',student.name);

        student.hobby='music'  //增加爱好属性
        delete student.num  //删除学号属性

        for (var key in student) {
            console.log('属性名 ',key,' 属性值 ',student[key])
        }
        
        //构造函数方式
        var stu =new Object()
        stu.name='Lucy'
        stu.sex='female'
        stu.grade='Chinese'
        document.write('name:',stu.name);
        
        </script> 
</body>

 

        2.学习成绩1

<body>
    <script>
        //1.创建一个学生成绩数组,存储所有学生的数学成绩,分别是89,78,90,99,67,59
        var scoreArr = [89, 78, 90, 99, 67, 59, ]
        //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);

        /*4.求不及格的学生有几个,打印输出到界面
        分析:遍历学生成绩数组,与68比较,如果小60不及格,计数器加一*/
        var count = 0 //计数
        for (var i = 0; i < scoreArr.length; i++) {
            if (scoreArr[i] < 60) {
                count++
            }
        }
        console.log('不及格人数是', count)
    </script>
</body>

         输出:

最大值 99        

不及格人数是 1

        3.学习成绩2

<body>
    <script>
        var scoreArr=[89,78,90,99,67,59]
        document.write('所有成绩:',scoreArr,'<br>')
        for(var i=0;i<scoreArr.length;i++){
            var max=scoreArr[0]
            if(max<scoreArr[i]){
                max=scoreArr[i]
            }
        }
        document.write('最高成绩:',max,'<br>')

        for(var i=0;i<scoreArr.length;i++){
            var min=scoreArr[0]
            if(min>scoreArr[i]){
                min=scoreArr[i]
            }
        }
        document.write('最低成绩:',min,'<br>')

        var count=0
        for(var i=0;i<scoreArr.length;i++){
            if(scoreArr[i]<60){
                count++
            }
        }
        document.write('不及格人数:',count,'<br>')
    </script>
</body>

        4.求s = a + aa + aaa + aaaa+….+aa...a的值,其中a是一个数字

<body>
    <script>
        function fun(a,n){
            var s=a
            var t=a
            for(var i=1;i<n;i++){
                a=a*10+t
                s += a
            }
            return s
        }
        fun(1,3)
        document.write(fun(1,3)+"<br>")
    </script>
</body>

        输出:123

        5.求100-200以内的质数

<body>
    <script>
        function prime(){
            for(var i=100;i<=200;i++){
                var flag=1
                for(var j=2;j<i/2;j++){
                    if(i%j==0){
                        flag=0
                    }
                }
                if(flag == 1)
                    document.write(i + ' ')
            }
        }
        prime()
    </script>
</body>

        输出:101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199

        6.学生成绩3 和 交换数组元素

<body>
    <script>
        var score=[98,87,95,89,77]
        var total=0
        for(var i=0;i<score.length;i++){
            document.write(score[i]+" ")
            total += score[i]
        }
        document.write('<br>总成绩为:'+total)
        var avg=total/score.length
        document.write('<br>平均分:',avg)
        document.write('<br>大于平均分的成绩有:')
        for(var i=0;i<score.length;i++){
            if(score[i]>avg){
                document.write(score[i],' ')
            }
        }

        //交换两个数
        var two=[3,6]
        document.write('<br>交换前:',two)
        var temp=two[0]
        two[0]=two[1]
        two[1]=temp
        document.write('<br>交换后:',two)
    </script>
</body>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值