返回顶部
首页 > 资讯 > 精选 >this指向的含义是什么
  • 332
分享到

this指向的含义是什么

2023-06-03 17:06:36 332人浏览 泡泡鱼
摘要

本篇内容主要讲解“this指向的含义是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“this指向的含义是什么”吧!如何讲清楚this指向?不得不说,要搞清楚this是需要一个前提的。  你首

本篇内容主要讲解“this指向的含义是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“this指向的含义是什么”吧!

如何讲清楚this指向?不得不说,要搞清楚this是需要一个前提的。

  你首先得知道函数、对象、作用域等基本概念。

  知道 call、apply、bind方法那再好不过了

  当然学好语文是很重要的

  需要知道第一人称和第二人称和第三人称的区别

先来看一个新闻:

“我体内的恶魔已被住了这么多年,现在这种锁链已经松了。”
“我很害怕,很孤独,很疑惑,我将要向导致我的痛苦的根源——社会作出反击,我想尽我所能地去伤害这个社会,然后死去。”

这段令人不寒而栗的文字,是美国北达科他州系列杀人案嫌犯约瑟夫·邓肯于2005年5月11日写下的。当人们在近两个月后看到这段文字时,他已经将一个 5口之家的3人残忍地杀害,并绑架了另外2名分别为8岁和9岁的孩子。


假设,你是一个jc,抓到了一个xf
然后你在他的家里搜出这本日记,此时你作何感想?

你肯定会想,如果这是嫌疑人自己写的,这不就等于认罪了嘛?

当然,犯罪嫌疑人也可以狡辩说,这日记根本不是我写的,只是我从网上摘抄的段子

我们试着把日记稍作改动,看看会有什么效果变化。

体内的恶魔已被锁住了这么多年,现在这种锁链已经松了。很害怕,很孤独,很疑惑,将要向导致的痛苦的根源——社会作出反击,想尽所能地去伤害这个社会,然后死去。

注意到了吗?

把第一人称改成了第三人称

这看上去根本不像日记,更像是一个小说故事。

为什么一个字的改动会有这么大差别呢?

带着对这个问题的思考, 我们来开始今天this指向的学习。

this的英文含义

先看英文解释 this: 这样、这个

接下来看一段代码

var obj = {

    show : function(){

        console.log(this);

    }}obj.show();

结果很容易预测,打印obj对象本身

js中,this属于一个关键字,也就是可以理解为,它是一个系统自带命令

通常,我们把它的含义解释为:当前对象

那么问题来了: 当前对象到底是指谁呢?

在上面的代码案例中,this代表的就是obj这个对象

接下来我们再看一段代码

function show(){

    console.log(this);}show();

结果打印window对象

如果你对这个打印结果感到奇怪,那么可能你忽略了一个常识问题

window对象是可以省略不写的!

所以,上面的代码,实际上等价于:

function show(){

    console.log(this);}window.show();

我再举一个常见的例子,关于事件绑定

btn.onclick = function(){

    console.log(this);}btn.onclick();   //手动调用函数//除手动调用外,鼠标单击按钮也可以触发函数执行

最终,无论是手动调用,还是单击按钮调用

打印结果都是btn对象

我们似乎总结出了一个this指向的规律

this总是指向,调用该函数的对象

如果你的代码结构是这样的

对象.函数();

那么,函数里的this,必然指向这个对象本身!

假设这个结论是成立的, 我们不妨来验证一下我们的猜想!!

function show(){

    console.log(this);}window.show();  //打印window对象var obj1 = {};obj1.show1 = show;obj1.show1();  //打印obj1对象var obj2 = {};obj2.show2 = obj1.show1;obj2.show2();  //打印obj2对象

从上面代码的例子中,可以看出来

window对象和obj1对象和obj2对象,共享了一个函数 show

window.show == obj1.show1;  //truewindow.show == obj2.show2;  //true

三个对象,用了同一个函数

但打印出的this是各不相同的

window.show(); 打印出window对象

obj1.show1(); 打印出obj1对象

obj2.show2(); 打印出obj2对象

这似乎再一次印证了,我们刚才的猜想:

函数由哪个对象调用,this就指向哪个对象

科学是严谨的,得出结论之前,我们还是要反复验证

再看一个例子:

btn.onclick = function(){

    setTimeout(function(){

        console.log(this);

    },0)}btn.onclick();

实际上,我只是在原来代码的基础上,增加了一个延迟器,并且时间设为0

那么打印出的this会不会有变化呢??

你可以先思考一番

通常按照直觉,我们会认为,延迟器只是延缓了执行时间,打印结果依然还是btn对象,没有变化

但经过测试发现,实际的打印结果,是 window对象

是我们刚才的猜想错了吗?

要解释这个现象,我们得重新来观察这段代码

btn.onclick = function(){  //<----这个函数,用A来表示    setTimeout(function(){ //<----这个函数,用B来表示        console.log(this);

    },0)}btn.onclick();

注意代码当中出现了两个函数,我们分别起名字叫做函数A函数B

按照我们刚才的猜想: 函数由哪个对象调用,this就指向哪个对象

所以,this指向会依赖它所在的函数

而这个函数,到底是 函数A还是函数B呢?

其实你不难从代码中看的出来, this很明显是在函数B中的

所以, 结果没有打印出 btn, 现在我们也不感到奇怪了

因为, this已经不再函数 A的内部了,而是函数B的内部

你可能还要问,为什么函数B里的 this指向window呢?

这里其实算是一个特例,传入定时器的函数,由哪个对象调用,我们不得而知

这种情况,this就指向window

你暂时记住这个规律就好了,等你学完了作用域链,你就会明白其中的本质

回到我们开头的新闻

假设日记就是嫌疑人写的。 但日记里全是第三人称。那么 『 他 』到底是谁就很难说了

反过来如果日记里用的都是第一人称写的。 那么 『 我 』肯定指的是嫌疑人自己

JS函数当中的this关键字, 就相当于我们说话中的第一人称代词我

例如这样一个例子:

A对B说:“我要杀了你!”

这里的『我』指代A, 『你』指代B

B对A说:”我要弄死你!”

这里的『我』指代B, 『你』指代A

所以你看,同样的一个字,它可以指代任何人,关键看从谁的嘴里说出来

function fn(){

    //this, 就相当于中文里的我    //不要上来就问this会指向谁    //我们必须搞清楚上下文环境,fn是谁调用的?(相当于这句话从谁的嘴里说出来)    //如果我们不能弄清楚这个问题,讨论this指向就没有意义    console.log(this);}

到目前为止,我们差不多可以得出结论了

下面用几个练习最终验证一下

var obj = {

    show: function(){

        console.log(this);

    }}

上面的代码,最终打印obj对象
无论经过多少曲折,我们最终只看一个结论,那就是:

this所在的函数,由哪个对象调用?


我把代码进一步改造

function fn(){

    console.log(this);}

var obj = {

    show: fn}

btn.onclick = function(){

    window.setTimeout(function(){

        obj.show();

    }, 100);}

上面的代码,最终打印还是obj对象


当然了,也总会有一些例外情况, 比如下面这个:

function m1(){

    function m2(){

        console.log(this);

    }

    m2();}m1();

我们不禁要问,函数m2是由哪个对象调用的?

我们想尽了各种可能,最终发现都是错的。

我们始终不知道这个m2由哪个对象调用,好像它就那样执行了

而实际的打印结果呢?

不出意外,还是window对象


最后的结论

1. 所有的this关键字,在函数运行时,才能确定它的指向

2. this所在的函数由哪个对象调用,this就会指向谁

3. 当函数执行时,没有明确的调用对象时,则this指向window

由this衍生出的问题

刚才遗留了一个问题没有解决

btn.onclick = function(){

    setTimeout(function(){

        console.log(this);

    },0)}btn.onclick();

我们期待this指向btn,而this现在却指向了window

这个问题该怎么修复呢? 有很多办法

如果你不知道call、apply、bind,那么恐怕你只能看得懂方法A

//方法Abtn.onclick = function(){

    var self = this//使用变量保存this,self变量的值是不会随着环境改变的    setTimeout(function(){

        console.log(self);  

    },0)}btn.onclick();

//方法Bbtn.onclick = function(){

    var self = this//使用变量保存this 

    function fn(){  //将代码写在一个函数fn中        console.log(this);

    }

    setTimeout(function(){

        fn.call(self); //强行指定this为self对象    },0)}btn.onclick();

//方法Cbtn.onclick = function(){

    var self = this//使用变量保存this 

    function fn(){  //将代码写在一个函数fn中        console.log(this);

    }

    setTimeout(function(){

        fn.apply(self); //使用apply方法调用函数,强行指定this为self对象    },0)}btn.onclick();

//方法Dbtn.onclick = function(){

    setTimeout(function(){

        console.log(this);

    }.bind(this), 0 )

    //使用bind方法,将定时器函数的this强行绑定为事件函数的this}btn.onclick();

接下来的内容,请学完ES6的箭头函数再来看吧

1. 如何判断箭头函数的this?

因为箭头函数不具备自己的this,所以非常简单,假装它不存在,就像这样:

这下this的指向非常清晰了吧

this指向的含义是什么

2. 箭头函数可以用call来改变this指向吗?

不能!! 试图改变箭头函数的this是徒劳的。

this指向的含义是什么

最后一个特例:构造函数

1. 什么是构造函数?

假设有一个函数Fn, 我们有两种方式来调用它

  • 普通的调用 Fn()

  • 配合new关键字来调用 new Fn()

第二种调用方式, 函数就变成了构造函数

---------------------------------------

注意,在构造函数中, 上面我们所讲的结论,是不成立的!!

到此,相信大家对“this指向的含义是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: this指向的含义是什么

本文链接: https://lsjlt.com/news/235111.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • this指向的含义是什么
    本篇内容主要讲解“this指向的含义是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“this指向的含义是什么”吧!如何讲清楚this指向?不得不说,要搞清楚this是需要一个前提的。  你首...
    99+
    2023-06-03
  • c++中this指针的含义
    c++ 中的 this 指针指向调用成员函数的当前对象,它允许函数访问对象成员变量和函数。其作用包括:访问对象成员变量;调用对象成员函数;作为对象引用的代理。 C++ 中的 this ...
    99+
    2024-05-10
    c++
  • javascript中的this指向什么
    这篇文章主要介绍“javascript中的this指向什么”,在日常操作中,相信很多人在javascript中的this指向什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • c++中this指针指向什么
    this 指针在 c++ 中指向当前对象的实例。用法包括:访问成员变量:this->成员变量名调用成员函数:this->成员函数名()传递对象引用:作为参数传递给其他函数,以...
    99+
    2024-05-09
    c++
  • es6箭头方法中this的指向是什么
    本教程操作环境:windows7系统、ECMAScript 6版、Dell G3电脑。箭头函数相信大家在日常开发中用到的地方非常之多,因为它很简洁,可读性强,但是它最大的好处,其实是解决了匿名函数的this指向问题,有利于封装回调函数。先来...
    99+
    2022-11-22
    箭头函数 javascript ES6
  • vue中的this指向有什么用
    小编给大家分享一下vue中的this指向有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue 中的this 指向?以上是...
    99+
    2024-04-02
  • Nginx正向代理与反向代理的含义是什么
    这篇文章主要介绍“Nginx正向代理与反向代理的含义是什么”,在日常操作中,相信很多人在Nginx正向代理与反向代理的含义是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Nginx正向代理与反向代理的含义...
    99+
    2023-07-05
  • JavaScript中this指向有什么用
    这篇文章给大家分享的是有关JavaScript中this指向有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript 中的 this 指向问题有很多文章在解释,...
    99+
    2024-04-02
  • vue中computed的this指向有什么用
    这篇文章主要为大家展示了“vue中computed的this指向有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中computed的this指向有什...
    99+
    2024-04-02
  • php的含义是什么
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php的含义是什么?PHP(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到...
    99+
    2015-05-18
    php
  • CSS的含义是什么
    这篇文章主要介绍了CSS的含义是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇CSS的含义是什么文章都会有所收获,下面我们一起来看看吧。   CSS的含义   CSS(...
    99+
    2024-04-02
  • JVM的含义是什么
    这篇文章主要介绍“JVM的含义是什么”,在日常操作中,相信很多人在JVM的含义是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JVM的含义是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!JVM是什...
    99+
    2023-06-17
  • PHP_EOL的含义是什么
    本文小编为大家详细介绍“PHP_EOL的含义是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP_EOL的含义是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。PHP_EOL是一个已经定义好的变量,代表...
    99+
    2023-07-05
  • html5的含义是什么
    这篇文章主要介绍“html5的含义是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“html5的含义是什么”文章能帮助大家解决问题。html5是“HyperText Markup Language...
    99+
    2023-07-05
  • cascade的含义是什么
    本篇内容介绍了“cascade的含义是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!cascade=”none”,默认值,告诉Hiber...
    99+
    2023-06-03
  • function的含义是什么
    本篇内容主要讲解“function的含义是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“function的含义是什么”吧!function是什么意思:答:function的意思是一种关键字。...
    99+
    2023-07-02
  • React组件里this指向了undefined的原理是什么
    这篇文章主要介绍“React组件里this指向了undefined的原理是什么”,在日常操作中,相信很多人在React组件里this指向了undefined的原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-07-05
  • javascript中this指的是什么
    这篇文章主要介绍javascript中this指的是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! this的中文意思为“当前;这个”,是javasc...
    99+
    2024-04-02
  • css是什么含义
    小编给大家分享一下css是什么含义,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   层叠样式表(CSS)是描述标记语言页面格...
    99+
    2024-04-02
  • jquery plugins的含义是什么
    本篇内容介绍了“jquery plugins的含义是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作