首页 > IT职业 > IT职场 > 实操ES6之Promise
写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/ ,如需转载,请注明出处,否则将追究法律责任。