一. 执行上下文
全局对象:全局属性和函数可用于所有内建的Javascript对象,全局对象的预定义属性都是不可枚举的。
顶层函数,全局函数eval( ); 计算Javascript 字符串,并把它作为脚本代码来运行。如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。
<script>
eval("x=10;y=20;document.write(x*y)"); //输出200
document.write("<br>" + eval("2+2")); //4
document.write("<br>" + eval(x+17)); //27
</script>
Javascript中代码的运行环境分为以下三种:
1.全局级别的代码-——默认的代码环境,一旦代码被引入,引擎最先进入的是这个环境。
2.函数级别的代码——当执行一个函数时,运行函数体中的代码。
3.eval的代码——在eval函数内运行的代码。
上下文的概念:为了表示不同的运行环境。执行上下文可以理解为当前代码的运行环境,它会形成一个作用域。
在JS中会产生多个执行上下文,JS引擎会以堆栈的方式来处理,栈底永远是全局上下文,栈顶是正在运行的上下文。
执行上下文决定了JS执行过程中可以获取哪些变量,函数,数据。每次某个函数被调用,就会有一个新的执行上下文为其创建。
(this指向的对象,叫做函数的上下文Context,也叫函数的调用者)。
二. 箭头函数
1. 箭头函数的基本语法格式为:(参数列表)={函数体}。如果箭头函数只有一个参数,并且箭头函数体中只有一行代码,可以再进行简化,实例如下:
let f = a=>a*a;
let res = f(5);
console.log(res);
注:如果箭头函数的函数体只有一行代码,并且返回的是一个对象,需要将对象包含在小括号内,这是因为大括号默认会被解释为代码块,如: let func = ( )=>({name:"R"});
2.箭头函数中this的固化
普通函数中的this默认指向调用函数的对象,也可以使用call, apply , bind 这些函数进行this指向的更改。但是在箭头函数中,this是被固化的,this在定义函数的时候就已经被绑定,不能修改,也和调用者无关。
三. Promise 对象
将任务交给某个对象完成,这个对象完成任务后再将结果反馈回来,任务有可能执行失败,无论任务执行成功与否,执行任务的对象都会将结果反馈回来,把这个对象叫做Promise对象。
使用Promise构造函数来进行Promise实例对象的创键,构造函数中需要传入一个函数作为参数,这个参数函数比较特殊,它有两个参数,分别用来触发Promise示例对象的任务执行完成消息和触发Promise示例对象的任务执行失败消息。参数函数的函数体就是Promise实例对象需要执行的任务代码。
Promise实例对象有3种状态,分别是pending(执行中),fullied(执行完成),rejected(执行失败)。这三种状态都是内部触发的,外部无法对其进行操作。实际开发中,一般不仅需要得到Promise任务执行的情况,甚至还需要获取到任务完成后的一些数据。Promise的then方法用来监听 执行情况并接收传递的数据。
let promise = new Promise( function(resole, reject){
setTimeout(()=>{
console.log("任务完成");
resolve("Success");
},3000);
});
promise.then((success)=>{
console.log(success);
},(error)=>{
console.log(error);
});
then方法中可以传入两个参数,第一个参数为当Promise任务执行完成时回调的方法,第2个参数为当Promise任务执行失败时回调的方法(非必需的)。resolve 和reject这两个参数实际上也是函数,只需要在函数体合适的地方对它们进行调用即可。比如上面的代码调用了resolve, 这时Promise示例对象的状态便置为已完成,之后执行them方法监听的已完成情况下的回调函数。
除了then方法,Promise实例对象中要定义一个catch方法, catch方法和then方法的区别只在于catch方法中只有一个参数,就是Promise执行失败后回调的函数。
let promise = new Promise( function(resole, reject){
setTimeout(()=>{
console.log("任务完成");
reject("error");
},3000);
});
promise.catch((error)=>{
console.log(error);
});
Promise任务链
任务B必须依赖于任务A ,即只有当任务A成功执行后才可以执行任务B, 使用Promise实现这种逻辑,Promise实例对象的then方法可以返回一个新的Promise来构成任务链。
let promise = new Promise( function(resole, reject){
setTimeout(()=>{
console.log("任务完成");
resolve("Success");
},3000);
});
promise.then((success)=>{
console.log(success);
return new Promise(resolve,reject)=>{
setTimeout(()=>{
console.log("任务2已完成");
resolve("success");
},2000)
});
},(error)=>{
console.log(error);
}).then(sucess=>{
console.log(success);
});
console.log("Nice Day");