this是和执行上下文绑定的
执行上下文:
- 全局执行上下文:全局执行上下文中的this也是指向window对象
- 函数执行上下文:使用对象来调用其内部的一个方法,该方法的this是指向对象本身的
- eval执行上下文:执行eval环境内部的以上两个情况 eval(string) eval方法,参数为字符串,计算字符串
new > bind > obj.foo() > foo()
- 当函数作为对象的方法调用的时候,函数的this对象就是该对象
- 当函数被正常情况下调用的时候,严格模式下,this指向undefined,非严格模式下this的指向全局对象window
- 嵌套函数中的this,不继承外层函数的this指向
- 箭头函数没有自己的执行上下文,所以箭头函数的this指向它外层函数的this
没有被引用的闭包会被自动回收,但是还在全局变量中,则依然会内存泄漏
当通过调用一个函数返回一个内部函数时,即使外部函数已经执行结束了,但是内部函数引用外部函数的变量还保存在内存中,我们把这些变量的集合成为闭包。
原型和原型链
每个js对象都有一个_proto_属性,这个属性指向原型
原型也是一个对象
微任务microTask:
- process.nextTick
- promise
- MutationObserve
- script
- setTimeout
- setInterval
- setImmediate
- I/O
- UI rending
手写代码:
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;
}