赞
踩
概念:this是运行环境下的一个系统变量,由于this在不同的执行环境下有不同的值,所以在使用this时,多加注意(使用this之前,先打印)
<script>
console.log(1, this);//window+文件路径
</script>
<body>
<button id="btn2">点我2</button>
<script>
btn2.onclick = function(){
console.log(2, this);//<button id="btn2">点我2</button>
}
</script>
</body>
<script>
var zhangsan = {
name: "张三",
age: 20,
eat: function() {
console.log(3, this);//{name:"张三",age:20,eat: function() {}}
}
}
zhangsan.eat()
</script>
function People(name, age) {
this.name = name;
this.age = age;
this.eat = function() {
console.log(4, this);//{name:"李四",age:20,eat: function() {}}
//{name:"小明",age:30,eat: function() {}}
}
}
var lisi = new People("李四", 20)
var xiaoming = new People("小明", 30)
lisi.eat();
xiaoming.eat();
如果内层的函数this不会继承外层函数this的值,内层函数使用箭头函数才能让内层函数的this和外层函数this统一指向
<body> <button id="btn5">点我5</button> </body> <script> btn5.onclick = function() { console.log(5.1, this)// <button id="btn5">点我5</button> // 内层函数直接调用 function fun() { console.log(5.2, this)//window } fun() // 内层函数用计时器调用 setTimeout(function() { console.log(5.3, this)//window }, 100) // 6, 在函数嵌套时, 如果像让内层函数的this和外层函数this统一指向, 内层函数请使用箭头函数 console.log(6.1, this)// <button id="btn5">点我5</button> var fun = () => { console.log(6.2, this)// <button id="btn5">点我5</button> } fun() setTimeout(() => { console.log(6.3, this)// <button id="btn5">点我5</button> }, 100) } </script>
fetch("https://m.douyu.com/api/room/list?page=1").then(function() {
console.log(7, this)//window
})
function add(a, b) { console.log(8, this, a + b) } add(3, 4) add.call("李四", 5, 6)//8,{"李四"},11 add.apply(false, [5, 6])//8,Boolean{false},11 var obj = { name: "思聪", age: 10 } // 调用bind后会返回一个新的函数 var newAdd = add.bind(obj, 5, 6) // 调用新的函数得到修改后的this newAdd()//8,{name:"思聪",age:10}
总结:
1,this指向的几种情况(谁调用,this就指向谁)
2,call,apply,bind 修改this的异同点
3,call,apply和bind的使用场景
Promise时ES6新增的一个类,可以解决异步操作上的弊端和问题
var promise = new Promise(function(resolve, reject){ // resolve 和 reject 也是两个函数, // 在promise对象中开始一个异步操作 fs.readFile("./1, es6简介.txt", function(err,data){ // 如果异步任务出错,就执行reject函数,传入错误信息 if(err) reject(err.message); // 如果异步任务成功, 就执行resolve函数, 传入成功的数据 else resolve(data) }) }) promise.then(function(res){ console.log(6, res) }) promise.catch(function(err){ console.log(6, err) })
var promise = new Promise(function(resolve, reject) {
fs.readFile("./data/b.txt", function(err, data) {
if (err) reject(err.message)
else resolve(data.toString())
})
})
//此时异步操作是成功的,所以只打印6.1,而6.2并不打印
promise.then(function(res) {
console.log(6.1, res);
}, function(err) {
console.log(6.2, err);
})
注意:
promise解决异步操作多层嵌套问题,还能解决多异步任务并发执行的问题
创建一个data文件夹里边有四个txt文件,分别是a.txt,b.txt,c.txt,d.txt,内容分别是:床前明月光,疑是地上霜,举头望明月,低头思故乡
var fs = require("fs"); // 需求:读取data目录下的4各为念中的4句诗,并按顺序拼接 // 方案三:使用promise解决异步操作多层嵌套问题 new Promise(function(resolve, reject) { fs.readFile("./data/a.txt", function(err, data1) { resolve(data1) }) }).then(function(data1) { return new Promise(function(resolve, reject) { fs.readFile("./data/b.txt", function(err, data2) { resolve(data1 + data2) }) }) }).then(function(data12) { return new Promise(function(resolve, reject) { fs.readFile("./data/c.txt", function(err, data3) { resolve(data12 + data3) }) }) }).then(function(data123) { return new Promise(function(resolve, reject) { fs.readFile("./data/d.txt", function(err, data4) { resolve(data123 + data4) }) }) }).then(function(data1234) { console.log(data1234);//床前明月光疑是地上霜举头望明月丢思故乡 }) // 缺点:promise虽然解决了多任务嵌套问题,但是以上三种方案存在一个共性弊端,就是多异步任务并发执行的问题
promise中的异步操作是在new创建直接开始执行的,then函数只是读取异步结果,而不是开始执行异步请求。
// 方案四: 使用promise解决多异步任务并发执行问题 var p1 = new Promise(function(resolve){ fs.readFile("./data/a.txt",function(err,data){ resolve(data) }) }) var p2 = new Promise(function(resolve){ fs.readFile("./data/b.txt",function(err,data){ resolve(data) }) }) var p3 = new Promise(function(resolve){ fs.readFile("./data/c.txt",function(err,data){ resolve(data) }) }) var p4 = new Promise(function(resolve){ fs.readFile("./data/d.txt",function(err,data){ resolve(data) }) }) //想把多个promise对象合成一个,promise类中提供了两个类方法:all、race var mergeP = Promise.all([p1,p2,p3,p4]) mergeP.then(function(dataArr){ console.log(4, dataArr.join("")) })
var p1 = new Promise(function(resolve) { fs.readFile("./data/a.txt", function(err, data) { resolve(data) }) }) var p2 = new Promise(function(resolve) { fs.readFile("./data/b.txt", function(err, data) { resolve(data) }) }) var p3 = new Promise(function(resolve) { fs.readFile("./data/c.txt", function(err, data) { resolve(data) }) }) var p4 = new Promise(function(resolve) { fs.readFile("./data/d.txt", function(err, data) { resolve(data) }) }) Promise.all([p1, p2, p3, p4]).then(function(res) { console.log(2, res.toString());//2,床前明月光,...低头思故乡 }) Promise.race([p1, p2, p3, p4]).then(function(data) { console.log(3, data.toString());//3,低头思故乡 })
补充:类方法、实例方法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。