魏名华

不要偷懒,做更好的自己

Nothing


No Welcome Message

重学前端-18 | JavaScript执行(三):你知道现在有多少种函数吗?

我们在讲函数调用之前,首先来认识一下函数家族。 

函数 在 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

看不懂