美文网首页
一文搞懂JS系列(十一)之this的三种特殊指向

一文搞懂JS系列(十一)之this的三种特殊指向

作者: 辉夜真是太可爱啦 | 来源:发表于2021-08-05 23:10 被阅读0次

    写在最前面:这是我写的一个一文搞懂JS系列专题。文章清晰易懂,会将会将关联的只是串联在一起,形成自己独立的知识脉络整个合集读完相信你也一定会有所收获。写作不易,希望您能给我点个赞

    合集地址:一文搞懂JS系列专题

    概览

    前言

    有三种情况下的 this 指向,是不需要动脑筋的,因为一看就是指向 window ,那么,分别是以下三种情况

    • 立即执行函数( IIFE
    • setTimeout 中传入的函数
    • setInterval 中传入的函数

    在这之前,我们先来看一个例子,为下面的例子进行铺垫

    var name = 'windowName'
    
    var dog = {
      name: 'wangcai',
      // 声明位置
      hello: function() {
        console.log(this.name)
      },
    }
    
    dog.hello() // wangcai
    

    经过上一节的学习,这道题是真的很简单,答案就是 wangcai 。

    如果没学过的,可以先移步一文搞懂JS系列(十)之彻底搞懂this指向进行学习,先对 this 指向有个大概的了解和认知。

    接下来,我们来逐个讲解 this 的三种特殊指向。

    立即执行函数( IIFE

    所谓立即执行函数,就是定义后立刻调用的匿名函数,为了证实这一个观点,我们来改写下上面的代码

    var name = 'windowName'
    
    var dog = {
      name: 'wangcai',
      // 声明位置
      hello: function() {
        (function () {
          console.log(this.name)
        }())
      },
    }
    
    dog.hello() // windowName
    

    可以看到,我们将 hello 方法重写了,在内部采用了立即执行函数的方式来 console.log(this.name) ,结果输出的是 this.name

    回想下上一节的内容,我们说过:

    当调用方法没有明确对象时,this 就指向全局对象。在浏览器中,指向 window;在 Node 中,指向 Global。(严格模式下,指向 undefined

    立即执行函数,就是所谓的定义后立刻调用的匿名函数,它并没有明确指定调用对象,所以,就指向了 window ,也就是最后输出的 windowName 。以后看到 立即执行函数,我们就要首先想到指向全局对象

    setTimeout 以及 setInterval 中传入的函数

    setTimeout 也同样有着指向 window 的黑魔法,我们来具体看一下这个例子:

    var name = 'windowName'
    
    var dog = {
      name: 'wangcai',
      // 声明位置
      hello: function() {
        setTimeout(function () {
          console.log(this.name);
        },100)
      },
    }
    
    dog.hello() // windowName
    

    可以看到,同样地,输出的也是 windowName 。

    再回顾一下我们上一节中的内容,this 永远指向最后调用它的那个对象

    我们都知道, setTimeout 是属于 window 的方法,从 MDN 中的描述大家就可以看出来了。

    image.png

    所以,在 setTimeout 中传入的函数,最后的调用对象始终是 window

    也就是说,上面的代码可以这么来理解

    var name = 'windowName'
    
    var dog = {
      name: 'wangcai',
      // 声明位置
      hello: function() {
        window.setTimeout(function () {
          console.log(this.name);
        },100)
      },
    }
    
    dog.hello() // windowName
    

    首先执行 dog.hello() 那么此刻,调用对象是 dog ,接着进入 dog.hello() 方法,执行了 window.setTimeout ,也就是说最后,执行 console.log(this.name) 的时候, this 指向已经是 window 了。也就是最后输出 windowName 。

    当然, setInterval 也是同理。

    image.png

    最后,再来总结一下,那就是:

    this 永远指向最后调用它的那个对象

    当调用方法没有明确对象时,this 就指向全局对象。在浏览器中,指向 window;在 Node 中,指向 Global。(严格模式下,指向 undefined

    好了,以上就是 this 的三种特殊指向,我们在下一节将会讲述改变 this 指向的几种方法。(尽快更新)

    系列目录

    相关文章

      网友评论

          本文标题:一文搞懂JS系列(十一)之this的三种特殊指向

          本文链接:https://www.haomeiwen.com/subject/nngvvltx.html