this几种情况(必会)
- this执行主体,谁把它执行的「和在哪创建&在哪执行都没有必然的关系」
- 函数执行,看方法前面是否有“点”,没有“点”,this是window「严格模式下是undefined」,有“点”,“点”前面是谁this就是谁
- 自执行函数里面的this是在非严格模式下是window,严格模式下是undefined
- 给当前元素的某个事件行为绑定方法,当事件行为触发,方法中的this是当前元素本身「排除attachEvent」
- 构造函数体中的this是当前类的实例
- 箭头函数中没有执行主体,所用到的this都是其所处上下文中的this
- 可以基于Function.prototype上的call/apply/bind去改变this指向
一道题彻底理解函数中this指向和闭包作用域
前置知识点
x *= (++x) + y 相当于 x = x( (++x) + y)
首先是 var
var x = 3,obj = {x: 5};obj.fn = (function () {this.x *= ++x;return function (y) {this.x *= (++x) + y;console.log(x);}})();var fn = obj.fn;obj.fn(6);fn(4);console.log(obj.x, x, window.x);

答案是:13、234、95、234、234
然后换成let
let x = 3,obj = {x: 5};obj.fn = (function () {this.x *= ++x;return function (y) {this.x *= (++x) + y;console.log(x);}})();var fn = obj.fn;obj.fn(6);fn(4);console.log(obj.x, x, window.x);

答案是:5、6、55、6、NaN
重点原因
首先是var 和 let区别
var 声明的变量 会在window上挂在 let 不会;
所以let 声明的x window.x 是undefined
let x = 3;// var x = 3console.log(window.x); // undefined(function () {console.log(this.x);//undefined 这里this是windowconsole.log(x); // 3this.x = ++xconsole.log(this.x); //4 这里this是window})()console.log(window.x); // 4 此时window 多了个x = 4的属性
几道练习
var name="window";function fn(){console.log(this.name)}var obj={name:"你好世界",fn:fn}obj.fn(); //this是obj=>"你好世界"fn();//this是window=>"window"(function(){this.fn(); //自执行函数里的this是window =>"window"})();
let obj={name:"li",fn:(function(n){// 这里的this windowconsole.log(this);return function(){// 这里的this=>objconsole.log(this);}})(10),}obj.fn();

