在js中,this是根据它的作用域来指向它的上下文环境。

全局执行

在全局环境中,我们看看它的this是什么:

研究javascript中的this

可以看到返回的是一个window对象。

在node中,this返回的是global对象。

总结:在全局作用域中它的 this 执行当前的全局对象(浏览器端是 Window,node 中是 global)。

函数中执行

纯粹的函数调用

研究javascript中的this

我们可以看到,一个函数被直接调用的时候,属于全局调用,这时候它的this指向全局对象。

严格模式 ‘use strict’;

 如果在严格模式的情况下执行纯粹的函数调用,那么这里的的 this 并不会指向全局,而是 undefined,这样的做法是为了消除 js 中一些不严谨的行为:

 研究javascript中的this

在控制台中,打印出undefined.

研究javascript中的this

当然,把它放在一个立即执行函数中会更好,避免污染全局:

研究javascript中的this

研究javascript中的this

作为对象的方法调用

 当一个函数被当做对象的方法调用的时候:

研究javascript中的this

研究javascript中的this

这时候,this指向了当前这个对象,

当然,我们还可以这么做,

研究javascript中的this

研究javascript中的this

同样不变,因为js中一切皆对象,函数也是一个对象,对于test,它只是一个函数名,函数的引用,它指向这个函数,当 foo=test时,foo同样也指向了这个函数。

如果把对象的方法赋值给一个变量,然后直接调用这个变量呢:

研究javascript中的this

研究javascript中的this

可以看到,这时候 this 执行了全局,当我们把 test = obj.foo ,test 直接指向了一个函数的引用,这时候,其实和 obj 这个对象没有关系了,所以,它是被当作一个普通函数来直接调用,因此,this 指向全局对象。

一些坑

 我们经常在回调函数里遇到一些坑:

    var obj = {
          name:'holy',
          foo:function(){
              console.log(this);
          },
          foo2:function(){
              console.log(this);
              setTimeout(this.foo,1000);
          }
      };
      
      obj.foo2();
View Code

相关文章:

  • 2021-08-28
  • 2021-09-24
  • 2022-01-20
  • 2022-01-21
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-11-20
  • 2021-08-02
  • 2021-12-05
相关资源
相似解决方案