自定义索引和函数

自定义索引

<body>
    <ul>
        <li>这是第1个li标签</li>
        <li>这是第2个li标签</li>
        <li>这是第3个li标签</li>
        <li>这是第4个li标签</li>
        <li>这是第5个li标签</li>
        <li>这是第6个li标签</li>
        <li>这是第7个li标签</li>
        <li>这是第8个li标签</li>
        <li>这是第9个li标签</li>
        <li>这是第10个li标签</li>
    </ul>
    <script>
        /* 
          把下标存在自定义属性index中
         */
        var oLi = document.getElementsByTagName("li");
        // //  添加自定义属性 
        // oLi[0].index = 0;
        // oLi[1].index = 1;
        // oLi[2].index = 2;
        // oLi[3].index = 3;
        // oLi[4].index = 4;
        // oLi[5].index = 5;
        // oLi[6].index = 6;
        // oLi[7].index = 7;
        // oLi[8].index = 7;
        // oLi[9].index = 9;
        // for (var i = 0; i < oLi.length; i++) {
        //     oLi[i].index = i;
        // }
        for (var i = 0; i < oLi.length; i++) {
            oLi[i].index = i;//自定义索引  就是自定义属性的一种
            oLi[i].onclick = function () {
                console.log(this.index)
            }
        }
    </script>
</body>

3.函数

3.1基础概念

  • 函数funtion:函数就是将具有独立功能的代码块 整合在一起并命名,什么时候需要什么时候调用

  • 作用:可以提高代码的重复率

rightBtn.onclick = function(){  change() }
​
leftBtn.onclick = function() { chagne() }
​
dots.onclick  = function() { change() }
​
//切换图片功能
function change(){
  切换图片
}
  • 使用场景

    • 1.作为事件处理函数使用

    1.作为事件处理函数使用
    button.onclick = function(){
      
    }
    • 2.==代码复用函数封装==

    rightBtn.onclick = function(){  change() }
    ​
    leftBtn.onclick = function() { chagne() }
    ​
    dots.onclick  = function() { change() }
    ​
    //切换图片功能
    function change(){
      切换图片
    }
    • 3.对象中的方法

    var obj = {
      "name":"Zs",
      "skill":function(){
        //对象中的函数不叫函数 叫方法
      }
    }
    ​
    //使用  obj.skill()

3.2函数声明及使用

  • 普通声明

    声明:funtion 函数名(){ 代码块 }
    使用:函数名()
    //1.普通声明
            function home() {
                //代码块
                console.log("做作业");
                console.log("打游戏");
                console.log("睡觉");
                console.log("看美女");
                console.log("吃法");
            }
            function home() {
                console.log(1);
            }
            // 使用  函数名()
            home();
            home();
            home();
  • 表达式声明

    声明:var 变量名 = function(){ 代码块 }
    使用:变量名()
     // 2.表达式声明  var 变量名 = function(){ 代码块 }
            var home1 = function () {
                console.log("中午吃饭睡午觉");
            }
            // 使用  变量名()
            home1();
            home1();
            home1();
            home1();

3.3函数参数

  • 什么时候使用参数

    • 当函数中出现不确定的值的时候,传递不同的参数 实现不同的功能

  • 参数

    • 形参:function 函数名(形参1,形参2,.......){ 代码块 } 形参之间用逗号隔开

    • 实参:函数名(实参1,实参2......)实参之间用逗号隔开 实参就是赋值给形参的值

  • 参数个数问题

            // 1.形参和实参个数一样
            function fun1(a, b) {//a 和 b都是形参 var a; var b; a=10 b=20
                console.log(a, b);// 10 20
            }
            fun1(10, 20);
    ​
            // 2.形参比实参个数多  从左往右一一赋值
            function fun2(a, b, c) {//var a=10 var b=20  var c
                console.log(a, b, c);// 10 20 undefined
            }
            fun2(10, 20);
    ​
            // 3.形参比实参个数少  从左往右一一赋值 多余的并不用管
            function fun3(a, b, c) {
                console.log(a, b, c);// 10 20 30
            }
            fun3(10, 20, 30, 40);
    ​
            // 4.参数个数不确定 arguments 参数的集合 arguments可以和形参一起使用
            function fun4(a, b) {
                console.log(a);// 10
                console.log(arguments);//集合
                console.log(arguments[0]);
                console.log(arguments.length);// 2 3 4
                var s = 0;
                for (var i = 0; i < arguments.length; i++) {
                    s += arguments[i];
                }
                console.log(s);
            }
            fun4(10, 20);
            fun4(10, 20, 30);
            fun4(10, 20, 30, 40);
  • 参数的数据类型

    ==所有的js数据类型都可以作为函数的参数 null和undefined不要作为参数 没有意义==

                // 5.参数的类型
        // 所有的js数据类型都可以作为函数的参数 null和undefined不要作为参数 没有意义
        function auto(a) {
            console.log(a);
        }
        auto("文字");
        auto([1, 3, 4, 5]);
        auto(true);
        auto({ "name": "zs", "age": 123 });
        auto(function () { });
  • ==函数的注意事项==

    • 重名会被覆盖 后面的会覆盖前面的

    • 当形参和实参参数不一致的时候 未被赋值的形参是undefined

<script>
        // 1.重名会被覆盖  后面的会覆盖前面的
        function auto() {
            console.log(1);
        }
        function auto() {
            console.log(2);
        }
        auto();
        // 2.当形参和实参参数不一致的时候
        function fun1(a, b, c) {//形参var a  var b  var c   a = 10  b=20
            console.log(a, b, c);//10 20 undefined
        }
        fun1(10, 20);
    </script>

3.4作用域

  • 概念:变量或者函数的有效使用范围

  • 分类:局部作用域 全局作用域

  • 名词

    • 全局变量/全局函数:在函数外面声明的变量/函数,可以在任意地方访问和修改,会一直存储在计算机的内存中,直到页面关闭

    • 局部变量/局部函数:在函数里面声明的变量/函数,只有在函数内部可以使用,出了函数就会被销毁,不能使用

3.4.1全局变量/函数

  • 全局变量/全局函数:在函数外面声明的变量/函数,可以在任意地方访问和修改,会一直存储在计算机的内存中,直到页面关闭

         var a = 10;//a 全局变量
        function fun1() {// fun1 全局函数
            var b = 20;// b 局部变量
            console.log(a);//10
            console.log(b);// 20
            function fun2() {
                console.log("这是局部函数fun2");
            };
            fun2();
​
        }
        fun1();
        console.log(a);//10
        // console.log(b);//报错 b is not defined

3.4.2局部变量/函数

  • 局部变量/局部函数:在函数里面声明的变量/函数,只有在函数内部可以使用,出了函数就会被销毁,不能使用

        var a = 10;//a 全局变量
        function fun1() {// fun1 全局函数
            var b = 20;// b 局部变量
            console.log(a);//10
            console.log(b);// 20
            function fun2() {
                console.log("这是局部函数fun2");
            };
            fun2();
​
        }
        fun1();
        console.log(a);//10
        // console.log(b);//报错 b is not defined

==注意事项:==

  • 注意1:只有函数{}内声明的都是局部 其他都是全局

  • 注意2:声明变量没有var 这是一个全局变量

        // 注意1:只有函数{}内声明的都是局部  其他都是全局
        if (1) {
            var n = 30;//全局
        }
        console.log(n);//30
​
        //注意2:声明变量没有var  这是一个全局变量
        function fun3() {
            a = 100;
        }
        fun3();
        console.log(a);

3.4.2作用域链

  • 作用域链:js的一种查找机制,先找自身作用域范围内的,依次父级作用域查找,一直到全局(window),如果全局也不到,则是返回报错信息 xxx is not defined

       var a = 100;// a 全局变量
        function fun1() {//fun1  局部变量
            var a = 20;// a 局部变量
            console.log(a);//20
        }
        fun1();
​
​
        var b = 100;
        function fun2() {
            b = 10;
            function fun2() {
                var b = 20;
            }
            console.log(b);//全局变量的b  10
            console.log(c);// c is not defined 
        }
        fun2();
  • 练习

<script>
        //练习题1:
        var a = 10;//全局变量
        function fun() {
            var b = 20;//局部变量
            console.log(a, b);//10 20
            a = 30;//修改的是全局变量a  
            b = 40;//修改的是局部变量b
            c = 50;//声明全局变量c
        }
        fun();
        console.log(c);// 50
        console.log(a);// 30
        // console.log(b);// b is not defined 
​
​
        //练习题2:
        var x = 0;//全局变量
        var y = 10;
        function fun2() {
            var x = 20;//局部变量
            console.log(x, y);// 20 10
            x = 30;// 修改的是局部x
        }
        fun2();
        console.log(x, y);// 0 10
​
        // //练习3:
        var n = 10;
        var m = 100;//全局变量m
        function fun3() {
            var m = 20;//局部变量m
            console.log(n, m);// 10 20
            n = 40;//修改全局的n
        }
        fun3();
        console.log(n, m);// 40 100
    </script>

3.5预解析

  • 浏览器在解析js代码的时候 遵循从上往下执行,中间会经历很多步骤 但是至少掌握朱两步

    • 1.预解析(变量提升)

      • a:先找var关键字 提前声明变量(只看等号左边的,如果变量重名,只声明一次)

      • b:再找function,提前声明整个函数,如果函数重名,会多次声明

    • 2.逐行执行

      • 逐行执行的时候不会在看var,只看赋值 函数只看调用 不看声明

 <script>
        console.log(a);//undefined
        var a = 10;
        console.log(a);//10
        //1.找var关键字
        var a = 100;
        var a = 10;
        console.log(a);//10
        // 2.找function
        var a = 100;
        function fun1() {
            console.log("函数1");
        }
        function fun1() {
            console.log("函数2")
        }
        fun1();//函数2
        console.log(a);//100
        // 3.普通函数和表达式函数有什么区别  普通函数可以提前调用  表达式函数不能提前调用
        auto();
        function auto() {
            console.log("普通函数")
        }
​
        // b();//undefined();报错
        var b = function () {
            console.log('表达式函数')
        }
​
​
        // 4.只要是作用域(全局作用域和局部作用域)  就一定会有预解析
        function fun2() {
            console.log(a);//undefined
            var a = 10;
        }
        fun2();
​
        //预解析+作用域链
        var x = 10;
        function fun3() {
            console.log(x);//undefined
            var x = 20;
            console.log(x);//20
        }
        fun3();
        console.log(x);//10
​
​
        //5.如果变量和函数重名  变量覆盖函数
        var a = 10;
        function a() {
            console.log("函数1")
        }
        console.log(a);//10
        a();// 10()   a is not a function
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值