工作太久很基础的东西是最容易忘掉,从这刻开始坚持每日打开从后往前回归,扎根基础,不断进步,才不至于不 KO,瑞思拜~
函数
第一种,普通函数:用function关键字定义的函数
示例:
function foot(){
let a = '1'
console.log(a)
}
第二种,箭头函数:用=>运算符定义的函数
示例:
cost foot = () =>{
let a = 1
console.log(a)
}
第三种,方法:在class中定义函数
示例:
class b {
foot(){
let a = 1
console.log(a)
}
}
第四种,生成函数:用function * 定义函数
示例:
function foo*(){
let a = 1
console.log(a)
}
第五种,类:用class定义的类,实际上也是函数
示例:
class Foot{
constructor(){
}
}
最后一种总结,异步函数:普通函数,箭头函数和生成函数加上async关键字
示例:
async function foot(){
console.log(0)
}
const foot = async () =>{
console.log(0)
}
async function foo*(){
console.log(0)
}
this关键字的行为
this是javasrcipt中的一个关键字,他的使用方法类似于一个变量,但是它跟变量的子能够为有很多的不同。
this是执行上下文很重要的一部分,同一个函数的调用的方式不同,得到的this值也有所不同。
function showThis(){
console.log(this);
}
var o = {
showThis : showThis
}
showThis()//gobal
o.showThis(); // o
我们获取函数的表达式,它实际上返回的并非函数本身,而是一个Reference类型
Reference类型由两部分组成:一个对象和一个属性值。不难理解o.showThis产生的Reference类型,即由对象o和属性“showThis”构成。
对于this的解释:调用函数时使用的引用,决定了函数执行时刻的this值。
从运行上来说,this跟面向对象毫无关联,它是与函数调用时使用的表达式相关
换成箭头函数结果就不一样了,改成箭头函数后,不论怎么引用,都不会影响他的this的值。
不难得出结果:
生成器函数、异步生成器函数和异步普通函数跟普通函数行为是一致的,异步箭头函数与箭头函数行为是一致的。
this关键字的机制
函数能引用定义时的变量,如上下文分析,函数也能记住定义时的this,因此,函数内部必定有一个机制来保存这些信息。
在javascript标准中,为函数规定了用来保存定义时上下文的私有属性【【Environment】】
当一个函数执行时,会创建一条新的执行环境记录,记录的外层词法环境会被设置成函数的【【Environment】】
var a = 1;
foo();
在别处定义了
var b = 2;
function foo(){
console.log(b);
//
2
console.log(a);
//
error
}
这里的foo能够访问b(定义时词法环境),却不能访问a(执行时的词法环境),这就是执行上下文的切换机制了。