你好javascript day7

1)作用域

var a=1;//全局变量
function addNumber(){
var a=2;//局部变量
a++;
console.log(a,"1");//3 }; console.log(a,"2");//1 addNumber(); console.log(a,"3");//1
//打印顺序 2 1 3
当在函数中定义变量时,这个变量的作用范围仅在函数中
外面调用不到的主要原因是因为a的作用范围仅在函数中,当函数执行完成后a就会自动被销毁
我们认为定义在函数外面的变量,叫做全局变量
定义在函数里面的变量,叫做局部变量
 
当在函数外打印变量,这个变量肯定就是全局变量
定义的局部变量不会改变全局变量
我们认为一旦在函数中定义了局部变量,那么这个局部变量名字如果和全局变量名相同
全局变量将无法直接在函数中使用了,局部变量的优先级高
       var a=3;
        function abc(a){
            // 参数就是局部变量,虽然没有使用var,但是一旦是确定为参数,就相当于
            // 定义了一个局部变量   var a
            console.log(a);//10
            a++;
        }

        abc(10);
        console.log(a);//3 */
        var obj={a:1};
        function abc(o){
            // 没有更改局部变量
            // o.a=10;
            // 这里才是真正更改局部变量,更改变量的引用地址
            o={a:10};

        }
        abc(obj);
        console.log(obj.a);
        var a=1;
        // 命名函数在代码中定义以后,script被执行时,会自动将函数放在堆中
        // 并且将函数存储在栈中的全局变量,定义函数全局是最为优先,最早的
        // 当代码执行到135行  var a=1时,才开始重新定义变量a,而这个变量a
        // 与栈中的全局函数a重名,因此变量a就会覆盖全局函数a
        function a(a){
            console.log(a);//(2)
            var a=3;
            console.log(a);//(3)
        }

        console.log(a);//(1)  1
        a(10);  //1不是一个函数所有报错
        console.log(a);//(4)

2)回调函数与递归函数

认识回调函数

       function abc(fn){
            // fn就是回调函数
            fn(3,5);
        }


        function getSum(a,b){
            console.log(a+b);
        }

        abc(getSum); 
       
        // 函数也是对象,当带入参数时
        // 桥接
         function countNumber(fn){
            // return fn(3,5);
            var s=fn(3,5);
            return s;
        }

        function getSum(a,b){
            return a+b;
        }

        function getMultiplication(a,b){
            return a*b;
        }


        // 需要计算3+5;
       var s=countNumber(getSum);
       console.log(s);
    //    需要计算3*5;
       var s=countNumber(getMultiplication);
       console.log(s); 
        // 回调函数可以应用在某个事件完成或者某个时间达到再去执行函数
        var i=0;
        // 这是一个方法,定时器,毫秒(单位)
        // setInterval(执行函数,间隔多长时间执行一次)
        // 时间间隔方法,每间隔1000毫秒执行一次方法,
        // 在这里animation函数就是回调函数,每间隔1000毫秒回调执行一次这个函数
      var ids=setInterval(animation,1000);
    //   返回一个值,这个值就是当前定时器的标识id

       function animation(){
            i++;
            console.log(i);
            if(i>10){
                // clearInterval清除定时器,ids就是刚才设置定时器时的返回标识id
                clearInterval(ids);
            }
       }


       var i=0;
       var ids=setInterval(animation,1000);
       function animation(){
            i++;
            console.log(i);
            if(i>10){
                clearInterval(ids);
            }
       }

认识递归函数

 递归如果没有限制的话就会造成堆栈上限溢出
 递归  自己执行自己
    var obj={
        a:{
            a:{
                a:{
                    a:{
                        a:null,
                        value:5
                    },
                    value:4
                },
                value:3
            },
            value:2
        },
        value:1
    };

    // 满足条件进入递归
    function showObj(o){
        console.log(o.value);
        if(o.a) showObj(o.a);
    }

    showObj(obj)

    // 当希望遍历具备有深度数据结构时,通常使用递归或者while更为方便
    // 当希望遍历具备广度数据结构时,一般使用for循环遍历
    // 遍历  全部每个逐个查看

3)数组

数组    数据的组合
 
        数组的新建方式
        字面量创建
        var arr=[4,5,3,6,2,1];
        这种叫构造函数创建
        var  arr1=new Array(4,5,3,6,2,1);
        console.log(arr,arr1);
        如果通过数组的构造函数创建数组,参数仅有1个,且这个参数是正整数,则表示新建
        一个具备该正整数长度的空数组,里面有这个长度的若干空元素
        如果是负数或者小数时,报错
        var arr2=new Array(5);//数组长度为5  没填入值  --》 undefined
        var arr2=new Array(3.5);//错误  必须是正整数
        如果输入的不是数值,是其他类型时,这个数据就会作为该数组的第0个元素,长度为1
        var arr2=new Array("a");//填入一个字符a  长度1
        console.log(arr2[0]);
长度就是元素的个数
下标是数组内每个值对应的编号 从零开始
数组的最大下标等于数组的长度减一  ---》 arr[最大下标]===arr.length-1
        数组的最大下标是数组的长度-1(元素个数-1);
        var arr=[1,2,3,5,,2,3,,5,2];//逗号间为空--》 即填入一个undefined 占一个下标
        var arr=[1,2,3,5,2,3,5,2];
        console.log(arr[4])
        console.log(arr.length);//就是数组的长度,也是元素的个数
        arr[4]=20;
        arr[arr.length-1]=20;
        arr[arr.length]=20;//在数组的最尾部添加一个元素
        console.log(arr);
arr.length=3;//数组的长度是可以被修改  等于0数组直接清空
4)对象的引用
        var o1={a:1};
        var o2=o1;
        o2.a++;
        console.log(o1.a); //a=2
        // 我们认为除了数值,字符,布尔值以外的其他对象,是被存储在堆中,并且有一个引用地址
        // 我们是将这个引用地址赋值给变量的,如果将一个变量赋值给另一个变量,就是将这个引用
        // 地址赋值给另一个变量,因此实际这两个变量指向的引用地址完全相同,更改其中一个,就
        // 会引起另一个的改变
       var o1={a:1};
        var o2={a:1};
        console.log(o1===o2);//false
        // 针对对象来说,判断是否相等不是根据内容是否相同,而是根据两个对象的引用地址是否相同
        // 如果使用新的{}产生的对象那就是新的地址
        var prev;
        function prevObj(o){
            if(prev){
                prev.a=0;
            }
            prev=o;
            prev.a=10;
        }

        var o1={};
        var o2={};
        prevObj(o1);
        // 到现在为止prev和o1的引用地址相同
        // o1.a=10;
        prevObj(o2);
        // 到现在为止  o1.a变成0
        // prev重新设置为o2,prev和o2的引用地址相同
        // o2.a=10;

5)切换图片

案例:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      ul {
        list-style: none;
        margin: 0;
        padding: 0;
      }
      li {
        float: left;
        margin-left: 20px;
        text-align: center;
         20px;
        height: 20px;
        border-radius: 50%;
        border: 1px solid #ff0000;
      }
      div {
         400px;
        height: 180px;
        background-size: 100% 100%;
        background-image: url("./img/a.png");
        position: absolute;
        transition: all 1s;
        top: 50px;
      }
    </style>
  </head>
  <body>
    <ul>
      <li id="li1">1</li>
      <li id="li2">2</li>
      <li id="li3">3</li>
      <li id="li4">4</li>
      <li id="li5">5</li>
    </ul>
    <div id="div0"></div>

    <script>
      var prevDot, div0;
      init();
      function init() {
        div0 = document.getElementById("div0");
        for (var i = 1; i < 6; i++) {
          var li = document.getElementById("li" + i);
          li.onclick = clickHandler;
        }
        changeDot(document.getElementById("li1"));
      }

      function clickHandler() {
        changeDot(this);
        var imgSrc = callBackDiv(this);
        div0.style.backgroundImage = imgSrc;
      }

      function changeDot(li) {
        if (prevDot) {
          prevDot.style.backgroundColor = "rgba(0,0,0,0)";
        }
        prevDot = li;
        prevDot.style.backgroundColor = "red";
      }

      function callBackDiv(li) {
        if (li.id === "li1") return "url(./img/a.png)";
        if (li.id === "li2") return "url(./img/b.png)";
        if (li.id === "li3") return "url(./img/c.png)";
        if (li.id === "li4") return "url(./img/d.png)";
        if (li.id === "li5") return "url(./img/e.png)";
      }





      function circleArea(r){
        return 3.1415926*r*r;
      }

      var a=circleArea(30);
      console.log(a);


      function rectArea(w,h){
        return w*h;
      }

      var s=rectArea(30,50);
      console.log(s);
    </script>
  </body>
</html>
原文地址:https://www.cnblogs.com/zqm0924/p/12907547.html