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;
//自动轮播
}
})
1403

被折叠的 条评论
为什么被折叠?



