JS(五)——执行上下文,箭头函数,Promise

一. 执行上下文

全局对象:全局属性和函数可用于所有内建的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");

猜你喜欢

转载自blog.csdn.net/Rqlinna/article/details/81517535