笔记

91 阅读2分钟

this是和执行上下文绑定的

执行上下文:

  • 全局执行上下文:全局执行上下文中的this也是指向window对象
  • 函数执行上下文:使用对象来调用其内部的一个方法,该方法的this是指向对象本身的
  • eval执行上下文:执行eval环境内部的以上两个情况 eval(string)  eval方法,参数为字符串,计算字符串
根据优先级来决定this的指向:

new  > bind > obj.foo() > foo()

  1. 当函数作为对象的方法调用的时候,函数的this对象就是该对象
  2. 当函数被正常情况下调用的时候,严格模式下,this指向undefined,非严格模式下this的指向全局对象window
  3. 嵌套函数中的this,不继承外层函数的this指向
  4. 箭头函数没有自己的执行上下文,所以箭头函数的this指向它外层函数的this
闭包

没有被引用的闭包会被自动回收,但是还在全局变量中,则依然会内存泄漏

当通过调用一个函数返回一个内部函数时,即使外部函数已经执行结束了,但是内部函数引用外部函数的变量还保存在内存中,我们把这些变量的集合成为闭包。

原型和原型链

每个js对象都有一个_proto_属性,这个属性指向原型

原型也是一个对象


微任务microTask:

  • process.nextTick
  • promise
  • MutationObserve
宏任务macroTask:
  • script
  • setTimeout
  • setInterval
  • setImmediate
  • I/O
  • UI rending
任务分成宏任务和微任务,宏任务属于同步任务,在执行栈,执行栈为空,查询是否有微任务需要执行,必要时渲染UI,然后开始下一轮eventloop


手写代码:

new操作符

var New = function(fn){
    var obj = {}; //init a obj
    var arg = Array.prototype.slice.call(arguments,1); //把参数截取出来
    obj._proto_ = fn.prototype; //将obj的原型链_proto_指向构造函数的原型prototype
    obj._proto_.constructure = fn; //在原型链_proto_上设置构造函数的构造器constructor,为了实例化fn
    fn.apply(obj,arg) //改变this指向,将fn指向obj
    return obj;
}