ITPub博客

首页 > IT职业 > IT职场 > 实操ES6之Promise

实操ES6之Promise

原创 IT职场 作者:mengmie 时间:2020-09-08 11:00:04 0 删除 编辑

  写Promise的时候,自然而然会使用箭头函数的编写方式。箭头函数就是.Neter们熟知的lambda函数,已经被大部分主流语言支持,也受到了广大码农的交口称赞,但是Jser们却会遇到不大不小的一个坑。

  众所周知,js函数中的this由调用它的上下文决定,我们还可以通过apply、call、bind等方式绑定上下文,从而改变函数中this的运行时指向。而当this遇到lambda时,又有所不同。

  Copy

  function Test(){

  this.name="alice"

  }

  Test.prototype={

  normal:function(){

  console.info(this.name)

  },

  lambda:()=>{

  console.info(this.name)

  }

  }

  let test=new Test()

  test.normal()//输出:alice

  test.lambda()//输出:undefined

  为什么会这样?网上很多分析,让人云里雾里。其实只要了解了——lambda与普通方法一个主要区别就是它能保持外层上下文变量的引用——这个特性就明白了。用lambda在方法内写过嵌套局部方法的.Neter很容易理解这个说法。

  Copy

  private Action Test()

  {

  var name="alice";

  Action action=()=>Console.WriteLine(name);

  //name将被捕获,会一直生存到action被回收

  return action;

  }

  so,可以将js的箭头函数理解为受运行时外层影响的内嵌函数,它是在运行时赋值的——以上述js代码为例,js解释器解释Test.prototype的定义,解释到normal函数时,是不care其内部逻辑的,继续往下解释到lambda函数时,会过一遍其内部引用到的外部变量,若有则捕获用于真正执行时(所谓词法作用域)。此时这个this指的是运行环境的根对象(在浏览器中可能就是window对象),而不是test对象(此时还不存在噻)。注:本段为个人理解。

  再看一个代码片段,请读者自行尝试分析下:

  Copy

  var alice={

  age:18,

  getAge:function(){

  var aliceAge=this.age;//this是alice

  var getAgeWithLambda=()=>this.age;//this还是alice

  var getAgeWithFunction=function(){

  return this.age;//this是window

  }

  return[aliceAge,getAgeWithLambda(),getAgeWithFunction()]

  }

  }

  console.info(alice.getAge())//输出:[18,18,undefined]

  Promise#

  Promise主要是将原本的callback变为then,写出来的代码更便于阅读。有多种方式得到一个Promise对象:

  Promise.resolve():Promise.resolve('foo')等价于new Promise(resolve=>resolve('foo'))

  执行async修饰的函数:

  Copy

  async function newPromise(){}

  let p=newPromise()//p就是Promise对象


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69920885/viewspace-2717889/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: IT人员应聘建议
请登录后发表评论 登录
全部评论

注册时间:2020-08-18

  • 博文量
    14
  • 访问量
    169944