闭包、ajax、get请求、post请求、封装、解析数据 15

day15 闭包与ajax

1.回顾

面向对象继承方式

function Student(name,age,sex){ //父类
    this.name = name;
    this.age = age;
    this.sex = sex;
}
Student.prototype.study = function(){
    console.log("天天放假")
}
  • 原型链继承:子类的prototype = 父类的实例

    function MiniStudent(){ //子类
        this.eat = function(){
            console.log("吃饭睡觉长身体");
        }
    }
    //原型链继承
    MiniStudent.prototype = new Student("小螺号",3,"女");
    

    缺点:不能传参,每次都是创建的同一个对象,继承到引用数据类型一改全改

  • 对象冒充继承

    function MiniStudent(name,age,sex){ //子类   
        //对象冒充继承
        Student.call(this,name,age,sex);
        this.eat = function(){        
            console.log("吃饭睡觉长身体");    
        }
    }
    

    优点:能传参,继承到引用数据类型不会再一改全改

    缺点:不能继承父元素原型中的属性和方法

  • 混合继承

    function MiniStudent(name,age,sex){ //子类   
        //对象冒充继承
        Student.call(this,name,age,sex);
        this.eat = function(){        
            console.log("吃饭睡觉长身体");    
        }
    }
    //原型链继承
    MiniStudent.prototype = new Student("小螺号",3,"女");
    

    优点:能传参,继承到引用数据类型不会再一改全改,继承原型中属性和方法

    缺点:创建一个多余的父类实例

  • 寄生式组合继承

    function MiniStudent(name,age,sex){ //子类   
        //对象冒充继承
        Student.call(this,name,age,sex);
        this.eat = function(){        
            console.log("吃饭睡觉长身体");    
        }
    }
    //原型链继承
    MiniStudent.prototype = Object.create(Student.prototype);
    MiniStudent.prototype.constructor = MiniStudent
    
  • 前瞻后顾

     //1.(?=) : 前瞻 正向肯定预查  要检测的字符的后面必须是什么
    var str = "qew3re4@ewr5rwe";
    var reg = /\d(?=@)/;//检测数字,@前面的数字
    console.log(reg.exec(str)); //4
    
    //2.(?!):负前瞻 正向否定预查   要检测的字符的后面不能是什么
    var reg = /\d(?![a-z])/;//检测数字,后面不能是字母
    console.log(reg.exec(str)); //4
    
    //3.验证用户名,必须是数字和字母的组合 
    var user = "rwr12ewrew";
    //(?=.*[a-zA-Z].*) :必须有字母  (?=.*[0-9].*):必须有数字
    var reg = /(?=.*[a-zA-Z].*)(?=.*[0-9].*)^[0-9a-zA-Z]+$/;
    console.log(reg.exec(user));
    
    var user = "13213e21312";
    //(?!^[a-zA-Z]+$):不能纯字母  (?!^[0-9]+$):不能纯数字
    var reg = /(?!^[a-zA-Z]+$)(?!^[0-9]+$)^[0-9a-zA-Z]+$/;
    console.log(reg.exec(user));
    
    //4. (?<=) 后顾 反向肯定预查   要检测的字符的前面必须是什么
    var str = "ujiuyeweb1116web1102";  
    var reg = /(?<=\d)web/; //检测web,前面必须是数字
    console.log(reg.exec(str)); //["web", index: 13]
    
    //5. (?<!) 负后顾 反向否定预查   要检测的字符的前面不能是什么
    var reg = /(?<!\d)web/; //检测web,前面不能是数字
    console.log(reg.exec(str)); //["web", index: 6]
    

2.闭包

2.1 匿名函数自执行(IIFE) : 立即执行函数

//1.匿名函数(没有名字的函数)
/* function (){
     console.log("匿名函数");
} */

//2.匿名函数自执行,立即执行函数(IIFE)    
//语法:(声明函数)(调用)
(function(){
    console.log("匿名函数");
})();

//3.传参
(function(a,b){
    console.log(a+b);
})(10,20); //30

//4.返回值
var s = (function(a,b){
    return a+b;
})(10,20); 
console.log(s);

优点:避免全局污染,节约内存,优美的嵌入代码

使用场景:在封装函数的时候使用,在闭包场景中使用

2.2 闭包

  • 闭包的概念

    闭包:能够获取其他函数内部变量的函数   函数套函数
    function outer(){
        var a = 10;
        return function (){
            console.log(a++);
        }
    }
    闭包的优点:闭包中使用的变量会一直存储在内存中个,类似全局变量,避免全局污染
    缺点:可能会造成内存泄漏,不用的时候需要销毁
    
  • 闭包的使用场景

    • 使用函数内部变量的时候

      //闭包:能够访问其他函数内部变量的函数,函数套函数
      function outer(){
          var b = 10;
          return function inner(){
              console.log(b++);   //内部作用域可以使用外部作用域中变量和函数
          }
      }
      var f = outer();  //f = function inner(){}
      console.log(f);
      
      f(); //10
      f(); //11
      f(); //12
      f = null;
      
      
    • 解决全局作用域问题

      //怎么修改
      //原因:自己作用域没有变量i,使用的是全局变量i
      //解决:让自己的作用域中有i
      var arr1 = [];
      for(var i = 0;i<10;i++){ //i = 10
          (function(i){//局部变量i
              arr1.push(function(){console.log(i);}) //局部变量i
          })(i); //全局变量i
      }
      arr1[4](); //4
      arr1[5](); //5
      
      
    • 用于私有属性(外界不可见)

      function Student(){
          var name = "小夏";
          this.getName = function(){
              return name;
          }
          this.setName = function(n){
              name = n
          }
      }
      
      
  • 闭包面试题

    //1.代码运行完以后的结果是,怎么修改?
    var arr = [];
    for(var i = 0;i<10;i++){ //i = 10
        arr.push(function(){console.log(i);})
    }
    arr[4]();
    
    
    //2.代码执行以后的结果是
    function fun(n,o){
        console.log(o);
        return {
            "fun":function(m){
                return fun(m,n)
            }
        }
    }
    var a = fun(0);
    a.fun(1);
    a.fun(2);
    a.fun(3);
    
    
    //3.代码执行以后的结果是
    //同步:在做某一个操作的时候,其他的只能等待  for alert
    //异步:在左某一个操作的时候,可以同时执行其他的操作  定时器
    for(var i = 0;i<5;i++){
        setTimeout(function(){
            console.log(i,new Date());
        },1000);
    }
    console.log(i,new Date());
    
    

3.ajax

ajax:Asynchronous JavaScript and XML 异步的JavasScript和XML

async:异步

作用:和后台进行数据交互,可以进行少量的数据交互,实现页面的异步更新

json:json数据

异步:浏览器在向服务器请求数据的时候,浏览器还可以做其他的操作

同步:浏览器在向服务器请求数据的时候,浏览器只能等待

3.1 get请求

//1.创建请求对象
var xhr = new XMLHttpRequest();

//2.建立连接 xhr.open(method,url,async);
//method:请求方式  get  post
//url:请求地址   get请求的参数在地址栏的后面  url?参数&参数
//async:是否异步  默认就是true
xhr.open("GeT","http://edu.xqb.ink/api/courselist?limits=5&classname=web前端",true);

//3.发送请求
xhr.send();

//4.监听结果
/* 
        准备状态码
        * 0: 创建了一个请求对象
        * 1: 和服务器建立了连接
        * 2: 发送了请求
        * 3: 服务器接收到了请求,并且正在处理
        * 4: 服务器处理完成并返回结果 (响应包)
        * 
        网络状态码
        *404  200  500
        */
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){ //有结果了,并且将结果返回
        if(xhr.status == 200){ //请求成功
            document.write( xhr.responseText)
        } 
    }
}

3.2 post请求

//1.创建请求对象
var xhr = new XMLHttpRequest();

//2.建立连接
xhr.open("post","http://edu.xqb.ink/api/registers",true);
//post请求,需要设置请求头
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

//3.发送请求  post请求参数,放在send里面
xhr.send("usr=txf1116&pwd=1234567");

//4.监听结果
xhr.onreadystatechange = function(){

    if(xhr.readyState == 4){
        if(xhr.status == 200){
            console.log(xhr.responseText);
        }
    }
}

3.3 封装

function ajax(requests) { //{url,type,data}
    //1.创建一个请求对象
    var xhr = new XMLHttpRequest();

    //2.建立连接
    if (requests.type.toLowerCase() == "get") {
        //如果有参数,就拼接在url的后面,没有就不拼
        var url = requests.data ? requests.url + "?" + requests.data : requests.url;
        xhr.open("get", url, true);
        //3.发送请求
        xhr.send();
    } else {
        xhr.open("post", requests.url, true);
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
        //3.发送请求
        xhr.send(requests.data);
    }

    //4.监听结果
    xhr.onreadystatechange = function(){
        if(xhr.readyState == 4){ //服务器处理结束,并且已经返回响应包
            if(xhr.status == 200){//请求成功
                requests.success(xhr.responseText);
            }
        }
    }

}


   

        ajax({
            "url": "http://edu.xqb.ink/api/banner",
            "type": "get",
            // "data":"",
            "success":function(res){//var res = xhr.responseText
                console.log(res);
            }        
        });

3.4 解析数据

//1.eval() : 接收一个字符串,把字符串转换真正的数据类型,并且执行里面的代码
console.log(eval("3+1")); //4
console.log(eval("[1,2,3,4]")); // [1, 2, 3, 4]
console.log(eval("[1,2,3,4].length")); //4

//console.log(eval("{'name':'蜡笔小新'}")); //js认为直接{}开头,这是代码块
console.log(eval("({'name':'蜡笔小新'})")); 
console.log(eval("("+res+")"));

//2.JSON.parse():将字符串格式的json数据转换为真正的json数据
res = JSON.parse(res);
console.log(res);

//3.JSON.stringify:将json转换转换为字符串
console.log(JSON.stringify(res))


3.5 使用

 //1.获取元素
var oUl = document.getElementsByTagName("ul")[0];
var oLi = oUl.getElementsByTagName("li");

//2.完善静态布局(获取后台数据,根据后台数据生成对应的标签)
ujiuye.ajax({
    "url":"http://edu.xqb.ink/api/banner",
    "type":"get",
    "success":function(res){
        var data = res.data;

        //根据后台数据生成对应的标签
        for(var i = 0;i<data.length;i++){
            oUl.innerHTML += " <li style='background: url("+data[i].coverimg+") center top no-repeat'></li>";
        }

        //1.初始化样式
        oLi[0].style.opacity = 1;


        //自动轮播
    }
})

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值