this几种情况(必会)

  1. this执行主体,谁把它执行的「和在哪创建&在哪执行都没有必然的关系」
  2. 函数执行,看方法前面是否有“点”,没有“点”,this是window「严格模式下是undefined」,有“点”,“点”前面是谁this就是谁
  3. 自执行函数里面的this是在非严格模式下是window,严格模式下是undefined
  4. 给当前元素的某个事件行为绑定方法,当事件行为触发,方法中的this是当前元素本身「排除attachEvent」
  5. 构造函数体中的this是当前类的实例
  6. 箭头函数中没有执行主体,所用到的this都是其所处上下文中的this
  7. 可以基于Function.prototype上的call/apply/bind去改变this指向

一道题彻底理解函数中this指向和闭包作用域

前置知识点

x *= (++x) + y 相当于 x = x( (++x) + y)

首先是 var

  1. var x = 3,
  2. obj = {
  3. x: 5
  4. };
  5. obj.fn = (function () {
  6. this.x *= ++x;
  7. return function (y) {
  8. this.x *= (++x) + y;
  9. console.log(x);
  10. }
  11. })();
  12. var fn = obj.fn;
  13. obj.fn(6);
  14. fn(4);
  15. console.log(obj.x, x, window.x);

QQ截图20210728114823.png
答案是:13、234、95、234、234

然后换成let

  1. let x = 3,
  2. obj = {
  3. x: 5
  4. };
  5. obj.fn = (function () {
  6. this.x *= ++x;
  7. return function (y) {
  8. this.x *= (++x) + y;
  9. console.log(x);
  10. }
  11. })();
  12. var fn = obj.fn;
  13. obj.fn(6);
  14. fn(4);
  15. console.log(obj.x, x, window.x);

THIS.png
答案是:5、6、55、6、NaN

重点原因

首先是var 和 let区别

var 声明的变量 会在window上挂在 let 不会;

所以let 声明的x window.x 是undefined

  1. let x = 3;
  2. // var x = 3
  3. console.log(window.x); // undefined
  4. (function () {
  5. console.log(this.x);//undefined 这里this是window
  6. console.log(x); // 3
  7. this.x = ++x
  8. console.log(this.x); //4 这里this是window
  9. })()
  10. console.log(window.x); // 4 此时window 多了个x = 4的属性

几道练习

  1. var name="window";
  2. function fn(){
  3. console.log(this.name)
  4. }
  5. var obj={
  6. name:"你好世界",
  7. fn:fn
  8. }
  9. obj.fn(); //this是obj=>"你好世界"
  10. fn();//this是window=>"window"
  11. (function(){
  12. this.fn(); //自执行函数里的this是window =>"window"
  13. })();
  1. let obj={
  2. name:"li",
  3. fn:(function(n){
  4. // 这里的this window
  5. console.log(this);
  6. return function(){
  7. // 这里的this=>obj
  8. console.log(this);
  9. }
  10. })(10),
  11. }
  12. obj.fn();

this01.png