目录
中的this的指向" >Javascript中的this的指向
首页 web前端 js教程 Javascript中的this的讲解

Javascript中的this的讲解

Jun 11, 2018 pm 05:37 PM
javascript web前端

Javascript中的this的指向

初学javascript都会对jsthis有很多迷惑比如如下的例子:

var a = 'jack';var obj = {a: 'tom',b: function(){        console.log(this.a);}};var c = obj.b;c();//输出jack

刚接触js的人可能会用一些其他面向对象的语言理解,觉得这里输出的应该是tom,但实际上这里输出的时jack , 但这是问什么了?且楼主来一步步的分析.

js中常见的this的指向分为4:

1. 对象中的this指向

什么是对象中的this ,  也就是对象的属性是function, function中存在对this的使用 , 比如说如下例子:

var obj = {a: 'tom',b: function(){        console.log(this.a);}};obj.b();//输出的是tom

这种情况this指向的调用该函数的对象 , 这里就是obj , 再比如如下例子:

var obj = {a: 'tom',b: function(){        console.log(this.a);},c: {c0: 'rose',c1: function(){            console.log(this.c0);}    }};obj.c.c1();//输出jack

函数调用时包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象

但是在开篇的例子中又是为什么呢?

var a = 'jack';var obj = {a: 'tom',b: function(){        console.log(this.a);}};var c = obj.b;c();//输出jack

大家要记住一句话this指向它最后调用它的对象,也就是这里的c虽然被赋予了obj.b的值,但是变量c依然是被挂在全局的window对象上,所以最后this的指向是全局的window对象

2. 直接调用函数

也就直接使用声明式或变量式声明函数 , 在全局中直接调用函数

var name = 'tom';var a = function(){var name = 'jack';console.log(this.name);};console.log(a());//输出tom

这里的a是在全局的window在声明, 调用时也是等价于window.a()所以this的指向为全局的window对象,包括这种情况:

var name = 'tom';var a = function(){var name = 'jack';function b(){        console.log(this.name);}b();//输出tomconsole.log(this.name);};console.log(a());//输出tom

ab输出的都是tom , 函数b 在函数a中随后调用时却还是指向全局的window对象 , 这是为什么呢? 大家可以记住一句话 , js中只要没有对象直接调用函数 , 函数调用时this的指向都会被指向到全局的window对象

像之前的例子调用时都是 ,  obect.function() , this的指向都会被指向到object,

var obj = {a: 'tom',b: function(){        console.log(this.a);}};obj.b();//输出tom

像开篇的例子用这句话也很好理解 , 函数c的调用并没有对象的调用所以会被指向到全局的window对象上

var a = 'jack';var obj = {a: 'tom',b: function(){        console.log(this.a);}};var c = obj.b;c();//输出jack

3. 构造函数中的this的指向

Js中的构造函数跟普通函数并没有明显的划分 , 当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器。一个函数要作为一个真正意义上的构造函数,需要满足下列条件:

1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。

2构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。

例如:

function People(name, age, sex){this.name = name;this.age = age;this.sex= sex;}var p = new People('tom',12,'');console.log(p.name + p.sex + p.age); //输出tom12

这里的this指向的就是当前被创建的对象

当然构造函数也有特殊情况, 例如:

function People(name, age, sex){this.name = name;this.age = age;this.sex= sex;return {};}var p = new People('tom',12,'');console.log(p.name);//输出undefined

这里也不难理解构造函数要求返回值为this或非对象类型 , 所以这里的People并不是严格意义上的构造函数 , 这里声明的p其实只是函数People的返回值 , 所以最后的输出为undefined , 如果把这里的返回值改成非对象类型 , 最后的结果就不一样了

function People(name, age, sex){this.name = name;this.age = age;this.sex= sex;return 1;}var p = new People('tom',12,'');console.log(p.name);//输出tom

这里的People就是严格意义上的构造函数了 , 所以this还是指向当前被创建的对象

4. callapply调用函数

Callapply函数其实用法差不多 , 第一参数都是调用函数的对象 , 后面的参数都是函数的参数 , 只是call函数的传参方式为不限个数的传参 , call([thisObject[,arg1 [,arg2 [,...,argn]]]])后面的参数分别对应函数的调用的参数 , apply函数第一个参数和call的一样 , 第二个参数为数组类型 , apply([thisObj [,argArray] ])数组的每一个元素也分别对应函数调用的参数 , 当使用callapply函数是 , 方法中的this会被重新指向到callapply函数的第一个参数 , 例如:

var a = 1;var b = 2;var c = {a: 3,b: 4};function add(){    console.log(this.a + this.b)}add();//输出3add.apply(c);//输出7

第一add调用时并没有对象的直接调用所以会被指向到全局的window对象所以输出结果为3 , 而第一add函数的调用是通过apply函数所以this的指向会被引向到c 所以最后的输出结果为 7

Es6拓展:

 Es6中的箭头函数的this指向与es5this有所不同 , 我们这里提一下: 由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值,所以 call() / apply() / bind() 方法对于箭头函数来说只是传入参数,对它的 this 毫无影响。考虑到 this 是词法层面上的,严格模式中与 this 相关的规则都将被忽略。

1 . 对象中的箭头函数

var a = {name: 'tom',b: {c: () => {            console.log(this);}    },};a.b.c(); //输出window

对象中使用this会被指向到全局的window对象 , 所以在对象中使用箭头函数它this的指向也会被指向到全局的window对象.

2. 方法中箭头函数的调用

var test  = function(){this.time = 1;setTimeout(()=>{        console.log(this.time);},100)};var t = new test();//输出1

箭头函数中没有this指针 , 所以指向只和他创建时所处的上下文环境有关 , 这里的是构造函数的调用所以testthis的指向为t对象 , 所以箭头函数中的this也是指向还对象

本文介绍了Javascript中的this,更多相关内容请关注php中文网。

相关推荐:

关于微信小程序上传word、txt、Excel、PPT等文件的详解

微信小程序下载文件,如何通过后端PHP处理

介绍提高MySQL性能的7个技巧

以上是Javascript中的this的讲解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用WebSocket和JavaScript实现在线语音识别系统 如何使用WebSocket和JavaScript实现在线语音识别系统 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript实现在线语音识别系统引言:随着科技的不断发展,语音识别技术已经成为了人工智能领域的重要组成部分。而基于WebSocket和JavaScript实现的在线语音识别系统,具备了低延迟、实时性和跨平台的特点,成为了一种被广泛应用的解决方案。本文将介绍如何使用WebSocket和JavaScript来实现在线语音识别系

WebSocket与JavaScript:实现实时监控系统的关键技术 WebSocket与JavaScript:实现实时监控系统的关键技术 Dec 17, 2023 pm 05:30 PM

WebSocket与JavaScript:实现实时监控系统的关键技术引言:随着互联网技术的快速发展,实时监控系统在各个领域中得到了广泛的应用。而实现实时监控的关键技术之一就是WebSocket与JavaScript的结合使用。本文将介绍WebSocket与JavaScript在实时监控系统中的应用,并给出代码示例,详细解释其实现原理。一、WebSocket技

如何利用JavaScript和WebSocket实现实时在线点餐系统 如何利用JavaScript和WebSocket实现实时在线点餐系统 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket实现实时在线点餐系统介绍:随着互联网的普及和技术的进步,越来越多的餐厅开始提供在线点餐服务。为了实现实时在线点餐系统,我们可以利用JavaScript和WebSocket技术。WebSocket是一种基于TCP协议的全双工通信协议,可以实现客户端与服务器的实时双向通信。在实时在线点餐系统中,当用户选择菜品并下单

如何使用WebSocket和JavaScript实现在线预约系统 如何使用WebSocket和JavaScript实现在线预约系统 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript实现在线预约系统在当今数字化的时代,越来越多的业务和服务都需要提供在线预约功能。而实现一个高效、实时的在线预约系统是至关重要的。本文将介绍如何使用WebSocket和JavaScript来实现一个在线预约系统,并提供具体的代码示例。一、什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工

JavaScript和WebSocket:打造高效的实时天气预报系统 JavaScript和WebSocket:打造高效的实时天气预报系统 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的实时天气预报系统引言:如今,天气预报的准确性对于日常生活以及决策制定具有重要意义。随着技术的发展,我们可以通过实时获取天气数据来提供更准确可靠的天气预报。在本文中,我们将学习如何使用JavaScript和WebSocket技术,来构建一个高效的实时天气预报系统。本文将通过具体的代码示例来展示实现的过程。We

简易JavaScript教程:获取HTTP状态码的方法 简易JavaScript教程:获取HTTP状态码的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

javascript中如何使用insertBefore javascript中如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用于在DOM树中插入一个新的节点。这个方法需要两个参数:要插入的新节点和参考节点(即新节点将要被插入的位置的节点)。

JavaScript和WebSocket:打造高效的实时图像处理系统 JavaScript和WebSocket:打造高效的实时图像处理系统 Dec 17, 2023 am 08:41 AM

JavaScript是一种广泛应用于Web开发的编程语言,而WebSocket则是一种用于实时通信的网络协议。结合二者的强大功能,我们可以打造一个高效的实时图像处理系统。本文将介绍如何利用JavaScript和WebSocket来实现这个系统,并提供具体的代码示例。首先,我们需要明确实时图像处理系统的需求和目标。假设我们有一个摄像头设备,可以采集实时的图像数

See all articles