我们在讲函数调用之前,首先来认识一下函数家族。
函数 在 ES2018 中,函数已经是一个很复杂的体系了,我在这里整理了一下。
第一种,普通函数:用 function 关键字定义的函数。 示例:
function foo(){
// code
}
第二种,箭头函数:用 => 运算符定义的函数。 示例:
const foo = () => {
// code
}
第三种,方法:在 class 中定义的函数。 示例:
class C {
foo(){
//code
}
}
第四种,生成器函数:用 function * 定义的函数。 示例:
function foo*(){
// code
}
第五种,类:用 class 定义的类,实际上也是函数。示例:
class Foo {
constructor(){
//code
}
}
第六 / 七 / 八种,异步函数:普通函数、箭头函数和生成器函数加上 async 关键字。示例:
async function foo(){
// code
}
const foo = async () => {
// code
}
async function foo*(){
// code
}
正好这块急需了解,其中ES6 中的生成器函数介绍
this 关键字的机制
this 是执行上下文中很重要的一个组成部分。同一个函数调用方式不同,得到的 this 值也不同,我们看一个例子:
function showThis(){
console.log(this);
}
var o = {
showThis: showThis
}
showThis(); // global
o.showThis(); // o
普通函数的 this 值由“调用它所使用的引用”决定,其中奥秘就在于:我们获取函数的表达式,它实际上返回的并非函数本身,而是一个 Reference 类型(记得我们在类型一章讲过七种标准类型吗,正是其中之一)。
Reference 类型由两部分组成:一个对象和一个属性值。不难理解 o.showThis 产生的 Reference 类型,即由对象 o 和属性“showThis”构成。
非普通函数,this又不一样
const showThis = () => {
console.log(this);
}
var o = {
showThis: showThis
}
showThis(); // global
o.showThis(); // global
class C {
showThis() {
console.log(this);
}
}
var o = new C();
var showThis = o.showThis;
showThis(); // undefined
o.showThis(); // o
看不懂