关于变量赋值过程、自执行函数、作用域、this指向的个坑:

obj的值指向obj这个变量


// 代码执行过程:
1.变量提升,赋值。
2.obj完成赋值前,立即执行函数执行。
2.1 立即执行函数变量提升,产生一个私有的局部变量 n。
2.2 立即执行函数的作用域为 window,传入的实参值为全局变量n=1。
2.3 私有变量n = 3*1;
2.4 this.n 指向全局作用域,全局作用域下的n变为:4。
2.5 变量重复定义,私有变量n = 5。
2.6 n=5 this.n=4。
2.7 将这个函数作为值,返回给obj中的fn属性。
3.变量赋值完成,执行后面的代码
3.1 fn(3),函数没有n,向上级作用域查找,n=5。 fn()在全局作用域下执行,所以this指向全局作用域,this.n=4。 `console.log(m+(++n)) => 自增运算符,此时私有n = 6`
输出结果为:5 4 9
3.2 fn(3),函数没有n,向上级作用域查找,n=6。 obj调用的fn(),所以this指向obj,this.n=2。
输出结果为:6 2 10
3.4 输出结果为:4 2