我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript中的this指向问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript中的this指向问题怎么解决

这篇文章主要介绍了一文搞懂JavaScript中的this指向问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇一文搞懂JavaScript中的this指向问题文章都会有所收获,下面我们一起来看看吧。

this的概念:

  • 在js中,this的意思为“这个;当前”,是一个指针型变量,它动态指向当前函数的运行环境。

  • 在不同的场景中调用同一个函数,this的指向也可能会发生变化,但是它永远指向其所在函数的真实调用者;如果没有调用者,就指向全局对象window。

普通函数:关于this,谁调用就指向谁,没有调用者,就指向全局对象window。箭头函数:箭头函数的this指向于函数作用域所用的对象。

一、全局环境下的this指向

在全局作用域下,this始终指向全局对象window,无论是否是严格模式!

JavaScript中的this指向问题怎么解决

congsole.log()完整的写法是window.console.log(),window可以省略,window调用了console.log()方法,所以此时this指向window。

二、函数内的this

  • 普通函数内的this分为两种情况,严格模式下和非严格模式下。

1. 严格模式下:

JavaScript中的this指向问题怎么解决

直接test()调用函数,this指向undefined,window.test()调用函数this指向window。因此,在严格模式下, 我们对代码的的调用必须严格的写出被调用的函数的对象,不可以有省略或者说简写。

2. 非严格模式下:

JavaScript中的this指向问题怎么解决

非严格模式下,通过test()和window.test()调用函数对象,this都指向window。

三、对象中的this

对象内部方法的this指向调用这些方法的对象,也就是谁调用就指向谁

1. 一层对象:

JavaScript中的this指向问题怎么解决

调用obj.skill()方法,返回值为蒙犽,说明此时this指向obj。

2. 二层对象:

JavaScript中的this指向问题怎么解决

调用skill2()方法的顺序为,obj.obj2.skill2() ,返回值为鲁班,说明skill2()方法中的this指向obj2。

总结:

  • 函数的定义位置不影响其this指向,this指向只和调用函数的对象有关

  • 多层嵌套的对象,内部方法的this指向离被调用函数最近的对象

四、箭头函数中的this

箭头函数:this指向于函数作用域所用的对象。
  • 箭头函数的重要特征箭头函数中没有this和arguments,是真的没有!

  • 箭头函数没有自己的this指向,它会捕获自己定义所处的外层执行环境,并且继承这个this值,指向当前定义时所在的对象。箭头函数的this指向在被定义的时候就确定了,之后永远都不会改变。即使使用call()apply()bind()等方法改变this指向也不可以。

例子1:

JavaScript中的this指向问题怎么解决

  • 声明的是全局变量Obj,this指向箭头函数所在全局作用域的对象,即indow对象。

例子2:

JavaScript中的this指向问题怎么解决

  • 由于show函数是箭头函数,所以自身不能绑定this,因此找它的上一级作用域。如果父级作用域还是箭头函数,就再往上找,一层一层的直到直到this的指向。

  • window.show()返回值是window,所以this此时指向window;

  • window.obj.show(),obj是对象,非箭头函数,所以找到这里就停止了,this绑定到obj上。window调用obj,所以obj中的this也指向window。

五、构造函数中的this

构造函数中的this是指向实例。

JavaScript中的this指向问题怎么解决

由上图可以看出,构造函数中的this指向构造函数下创建的实例

、原型链中的this

this这个值在一个继承机制中,仍然是指向它原本属于的对象,而不是从原型链上找到它时,它所属于的对象。

七、改变this指向的方法

1. call()

  • call(a, b, c)方法接收三个参数,第一个是this指向,第二个,三个是传递给函数的实参,可以是数字,字符串,数组等类型的数据类型都可以。

示例:

//定义函数function fn(n1,n2){   console.log(this);     console.log(n1,n2)}//调用call()方法fn.call();//=>this:window;let obj = {fn:fn};fn.call(obj);   //=>this:obj;n1,n2:undefinedfn.call(1,2);//=>this: 1;n1=2,n2=undefined;fn.call(obj,1,2);//=>this: obj;n1=1,n2=2;   //Call方法的几个特殊属性   //非严格模式下fn.call(undefined);//this=>windowfn.call(null);//this=>window   //严格模式下"use strict"fn.call(undefined);//this=>undefinedfn.call(null);//this=>null
2. apply()
  • apply(a, [b])和call基本上一致,唯一区别在于传参方式,apply把需要传递给fn()的参数放到一个数组(或者类数组)中传递进去,虽然写的是一个数组,但是也相当于给fn()一个个的传递。

  • //call()的传参方式
    fn.call(obj, 1, 2);//apply()的传参方式fn.apply(obj, [1, 2]);

示例:

//apply方法的使用和call方法基本相同,唯一的区别是,apply方法传参要求是数组类型的,数组内可以任意形式的数据function fn (n1,n2){    console.log(this);    console.log(n1,n2)    console.log(arguments)}let obj = {fn:fn};    //调用apply()方法    fn.applay(abj,[1,2]);fn.applay(abj,1,2);    //报错    fn.applay(abj,[11,'apply',{a:123}]);    //注意第二个参数必须是数组,否则会报错
3. bind()
  • bind(a, b, c):语法和call一模一样,区别在于立即执行还是等待执行,bind不兼容IE6~8

  • bind与call的唯一区别就是call直接改变函数test的指向,而bind生成了一个新函数test2(),该函数改变了指向。

  • //call()方法:改变fn中的this,并且把fn立即执行fn.call(obj, 1, 2); //bind()方法:改变fn中的this,fn并不执行fn.bind(obj, 1, 2);

示例:

//bind和call方法调用形式类似,但是原理完全不同fn.call(obj,10,20);//=>fn先执行,将fn内的this指向obj,并且把参数10,20传递给fnfn.bind(obj,10,20)//bind是先将fn中的this指向obj,并且将参数10,20预先传递给fn,但是此时的fn并没有被执行,只有fn执行时this指向和传递参数才有作用fn.bind(obj,10,20);//=>不会有任何输出fn.bind(obj,10,20)();//=>调用后才会有输出//=>需求:点击box这个盒子的时候,需要执行fn,并且让fn中的this指向objoBox.onclick=fn; //=>点击的时候执行了fn,但此时fn中的this是oBoxoBox.onclick=fn.call(opp); //=>绑定事件的时候就已经把fn立即执行了(call本身就是立即执行函数),然后把fn执行的返回值绑定给事件oBox.onclick=fn.bind(opp);//=>fn.bind(opp):fn调取Function.prototype上的bind方法,执行这个oBox.onclick=function(){   //=>this:oBox    fn.call(opp);}

相同点:

  • call、apply和bind都是JS函数的公有的内部方法,他们都是重置函数的this,改变函数的执行环节。

不同点:

  • bind是创建一个新的函数,而call和aplay是用来调用函数;

  • call和apply作用一样,只不过call为函数提供的参数是一个个地罗列出来,而apply为函数提供的参数是一个数组

关于“一文搞懂JavaScript中的this指向问题”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“一文搞懂JavaScript中的this指向问题”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript中的this指向问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript中的this指向问题怎么解决

这篇文章主要介绍了一文搞懂JavaScript中的this指向问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇一文搞懂JavaScript中的this指向问题文章都会有所收获,下面我们一起来看看吧。this的
2023-07-04

JavaScript中this指向的问题怎么解决

今天小编给大家分享一下JavaScript中this指向的问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1. 默
2023-07-05

JavaScript this绑定与this指向问题如何解决

本篇内容主要讲解“JavaScript this绑定与this指向问题如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript this绑定与this指向问题如何解决”吧!一、
2023-07-05

一文详解JavaScript中this指向的问题

JavaScript中this指向的问题是面试中常常会问到的,所以本文就来通过一些简单的示例为大家详细讲讲,文中的示例代码讲解详细,需要的可以参考一下
2023-05-14

JavaScript中this指向问题的示例分析

这篇文章将为大家详细讲解有关JavaScript中this指向问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. 箭头函数箭头函数排在第一个是因为它的 this 不会被改变,所以只要当前函数
2023-06-14

一文搞懂JavaScript中的this指向问题

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于this指向的相关问题,this的意思是“这个、当前”,是一个指针型变量,它动态指向当前函数的运行环境,下面一起来看一下,希望对大家有帮助。
2023-05-14

JavaScript中this指针指向怎么理解

这篇“JavaScript中this指针指向怎么理解”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript中th
2023-07-04

如何理解JavaScript函数this指向问题

这篇文章给大家介绍如何理解JavaScript函数this指向问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、 函数内 this 的指向这些 this的指向,是当调用函数的时候确定的。 调用方式的不同决定了thi
2023-06-21

JavaScript中this指向怎么用

这篇文章主要介绍JavaScript中this指向怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript中this也是一件很神奇 事情,在面向对象(比如java)中表示一个当前的对象引用,但是在Ja
2023-06-25

javascript中this指向怎么调用

本篇内容介绍了“javascript中this指向怎么调用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaScript由于其在运行期进
2023-07-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录