面试题解析

var num = 10;
var obj = {
num: 20
};
obj.fn = (function (num) {
this.num = num * 3;
num++;
return function (n) {
this.num += n;
num++;
console.log(num);
}
})(obj.num);
var fn = obj.fn;
fn(5);
obj.fn(10);
console.log(num, obj.num);
 
通过画图方式讲解
全局的属性上下文EC(G) GO(全局对象)window指向GO,它是一个堆内存,在其中有许多内置的属性,setTimeout() 、eval、json;
还有存放全局变量的变量的对象VO(G),在该对象首先进行变量提升 var num var obj var fn,在新浏览器GO里也添加属性 num obj fn,通过let const 在要放在VO(G),跟GO(G)没关系,全局上下文基于vaf/function声明的变量给GO设置了对应的属性(新版本浏览器的特性)
在VO(G)代码执行,对象开辟一个对内存,obj加一个地址0x000,里面键值对num:20,把地址给GO(G)obj,num在GO(G)赋予10,obj.fn在地址0x000加fn属性,属性值是自执行函数,自执行函数是在给obj.fn赋值的时候执行的这时候this是windou或者是undefined,到底是不是undefined,就看是不是严格模式,自执行函数实参obj.num,传给自执行函数的形参num,自执行函数执行形成私有的上下文。
首先创建一个自执行函数的堆0x001,自执行函数在全局创建的,作用域是EC(G)
自执行函数执行0x001(20),形成上下文AO(AN),形成作用域<EC(AN),EC(G)>,初始化this,现在采用非严格模式,this是window,arment没用到,形参赋值num num为20,变量提升没有变量提升,代码执行,AO(AN)num =20,this.numthis是window,num是10,this.num = num * 3;num是私有的20,this.num=60,num++ 20变21,执行完毕return 一个函数返回一个堆内存0x002,
作用域还是EC(AN),执行代码字符串
this.num += n;
num++;
console.log(num);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/zhx119/p/14286606.html