Javascript This对象(转载)

JavaScript:this指向问题、同步和异步、 JS执行机制、location对象 this this 的指向在函数定义的时候 是确定不了的 只有函数执行的时候才能确定this指向谁 一般情况下 this 的最终指向的是那个调用它的对象 .全部作用域或者普通作用函数中 this指向全局对象window (定时器里面的 this指向window) 方法调用中 谁调用this指向谁 构造函数this指向构造函数 <body> <button> 按钮</button> <script> // this 指向问题 阅读详情

  首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题。

  为什么要学习this?如果你学过面向对象编程,那你肯定知道干什么用的,如果你没有学过,那么暂时可以不用看这篇文章,当然如果你有兴趣也可以看看,毕竟这是js中必须要掌握的东西。

 

例子1:

function a(){
    var user = "追梦子";
    console.log(this.user); //undefined
    console.log(this); //Window
}
a();

按照我们上面说的this最终指向的是调用它的对象,这里的函数a实际是被Window对象所点出来的,下面的代码就可以证明。

function a(){
    var user = "追梦子";
    console.log(this.user); //undefined
    console.log(this);  //Window
}
window.a();

和上面代码一样吧,其实alert也是window的一个属性,也是window点出来的。

例子2:

var o = {
    user:"追梦子",
    fn:function(){
        console.log(this.user);  //追梦子
    }
}
o.fn();

  这里的this指向的是对象o,因为你调用这个fn是通过o.fn()执行的,那自然指向就是对象o,这里再次强调一点,this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁,一定要搞清楚这个。

其实例子1和例子2说的并不够准确,下面这个例子就可以推翻上面的理论。

如果要彻底的搞懂this必须看接下来的几个例子

本文出处:追梦子博客

例子3:

var o = {
    user:"追梦子",
    fn:function(){
        console.log(this.user); //追梦子
    }
}
window.o.fn();

  这段代码和上面的那段代码几乎是一样的,但是这里的this为什么不是指向window,如果按照上面的理论,最终this指向的是调用它的对象,这里先说个而外话,window是js中的全局对象,我们创建的变量实际上是给window添加属性,所以这里可以用window点o对象。

  这里先不解释为什么上面的那段代码this为什么没有指向window,我们再来看一段代码。

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //12
        }
    }
}
o.b.fn();

  这里同样也是对象o点出来的,但是同样this并没有执行它,那你肯定会说我一开始说的那些不就都是错误的吗?其实也不是,只是一开始说的不准确,接下来我将补充一句话,我相信你就可以彻底的理解this的指向的问题。

  情况1:如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题,你想了解可以自行上网查找。

  情况2:如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。

  情况3:如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象,例子3可以证明,如果不相信,那么接下来我们继续看几个例子。

var o = {
    a:10,
    b:{
        // a:12,
        fn:function(){
            console.log(this.a); //undefined
        }
    }
}
o.b.fn();

尽管对象b中没有属性a,这个this指向的也是对象b,因为this只会指向它的上一级对象,不管这个对象中有没有this要的东西。

还有一种比较特殊的情况,例子4:

var o = {
    a:10,
    b:{
        a:12,
        fn:function(){
            console.log(this.a); //undefined
            console.log(this); //window
        }
    }
}
var j = o.b.fn;
j();

这里this指向的是window,是不是有些蒙了?其实是因为你没有理解一句话,这句话同样至关重要。

  this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的,例子4中虽然函数fn是被对象b所引用,但是在将fn赋值给变量j的时候并没有执行所以最终指向的是window,这和例子3是不一样的,例子3是直接执行了fn。

  this讲来讲去其实就是那么一回事,只不过在不同的情况下指向的会有些不同,上面的总结每个地方都有些小错误,也不能说是错误,而是在不同环境下情况就会有不同,所以我也没有办法一次解释清楚,只能你慢慢地的去体会。

 

构造函数版this:

function Fn(){
    this.user = "追梦子";
}
var a = new Fn();
console.log(a.user); //追梦子

  这里之所以对象a可以点出函数Fn里面的user是因为new关键字可以改变this的指向,将这个this指向对象a,为什么我说a是对象,因为用了new关键字就是创建一个对象实例,理解这句话可以想想我们的例子3,我们这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a,那么为什么对象a中会有user,因为你已经复制了一份Fn函数到对象a中,用了new关键字就等同于复制了一份。

  除了上面的这些以外,我们还可以自行改变this的指向,关于自行改变this的指向请看JavaScript中call,apply,bind方法的总结这篇文章,详细的说明了我们如何手动更改this的指向。

 

更新一个小问题当this碰到return时

function fn()  
{  
    this.user = '追梦子';  
    return {};  
}
var a = new fn;  
console.log(a.user); //undefined

再看一个

function fn()  
{  
    this.user = '追梦子';  
    return function(){};
}
var a = new fn;  
console.log(a.user); //undefined

再来

function fn()  
{  
    this.user = '追梦子';  
    return 1;
}
var a = new fn;  
console.log(a.user); //追梦子
function fn()  
{  
    this.user = '追梦子';  
    return undefined;
}
var a = new fn;  
console.log(a.user); //追梦子

什么意思呢?

  如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。

function fn()  
{  
    this.user = '追梦子';  
    return undefined;
}
var a = new fn;  
console.log(a); //fn {user: "追梦子"}

  还有一点就是虽然null也是对象,但是在这里this还是指向那个函数的实例,因为null比较特殊。

function fn()  
{  
    this.user = '追梦子';  
    return null;
}
var a = new fn;  
console.log(a.user); //追梦子

知识点补充:

  1.在严格版中的默认的this不再是window,而是undefined。

  2.new操作符会改变函数this的指向问题,虽然我们上面讲解过了,但是并没有深入的讨论这个问题,网上也很少说,所以在这里有必要说一下。

function fn(){
    this.num = 1;
}
var a = new fn();
console.log(a.num); //1

  为什么this会指向a?首先new关键字会创建一个空的对象,然后会自动调用一个函数apply方法,将this指向这个空对象,这样的话函数内部的this就会被这个空的对象替代。

2017-09-15 11:49:14

  注意: 当你new一个空对象的时候,js内部的实现并不一定是用的apply方法来改变this指向的,这里我只是打个比方而已.

  if (this === 动态的\可改变的) return true;

2016.12.21更新

本文出处:https://www.cnblogs.com/pssp/p/5216085.html

相关文章推荐:

1、偶遇this之坑

2、JS中call、apply、bind使用指南,带部分原理。

3、那些年我们一起过的JS闭包,作用域,this,让我们一起划上完美的句号。

4、Nodejs中的this

js系列十二:this对象 前面我们已经讲过,当函数被调用执行时,变量对象会生成,这个时候,this 的指向会确定。因此首先要牢记一个重要的结论,当前函数的 this 是在函数被调用执行时才会确定的。如果当前的执行上下文处于函数调用栈的栈顶,那么这个时候变量对象会变成活动对象,同时 this 的指向确定。 正是由于这个原因,才导致一个函数内部的 this 到底指向谁是非常灵活并且不确定的,这也是 this 难以被正真理解的原... 阅读详情

相关推荐

避坑指南:Vue调用摄像头常见6大报错解决方案(navigator.mediaDevices全兼容方案)

本文深入剖析了在Vue应用中调用摄像头时常见的六大报错,如权限拒绝、设备未找到等,并提供了基于navigator.mediaDevices的全兼容解决方案。内容涵盖从HTTPS环境配置、浏览器兼容性处理到摄像头资源管理与高级错误处理,旨在帮助开发者构建稳定可靠的企业级摄像头应用。

Black的专栏 339

【汇编语言】对类型操作符THIS的一些理解

【汇编语言】对类型操作符THIS的一些理解 作用:利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型。 关于类型操作符THIS,通俗来讲就是主要作用即为给同一存储单元取另一别名,如 w_var equ THIS word b_var db 10 dup (0) 所以这样看来,b_var和w_var其实指向了同一个内存地址。但是存在的不同是,两者类型可能不同。如上例中,b_var是字节类型而w_var是字类型。 mox ax, word ptr w_var mov ax,b_var 这二者

qq_45954736的博客 3359

一起学习Avalonia(十三)

Avalonia 前面已经简单介绍了一下相关开发,有一个系统的了解。 到今天Avalonia已经基本成熟,但是扩展支持的还是不可能达到大企业的,我估计这也不可能。考虑了下,微软的MAUI框架可能会普及性更高,Avalonia也是我无意间知道的。 微软毕竟是会宣讲的全球。并且微软全球研发投入很大,全部专职开发,这种速度当然大。但是MAUI根据计划,可能还要很长时间,而且是社区支持Linux,估计时间更久。这不能适应现在的国产化开发。 预计一段时间还是需要Avalonia作为优先。当前Avalonia使

jinyuttt的专栏 4086

彻底理解js中this的指向

首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然网上大部分的文章都是这样说的,虽然在很多情况下那样去理解不会出什么问题,但是实际上那样理解是不准确的,所以在你理解this的时候会有种琢磨不透的感觉),那么接下来我会深入的探讨这个问题。   为什么...

weixin_30613343的博客 977

CEH Practical 实战考试真题与答案

CEH Practical 是 EC-Council 推出的Certified Ethical Hacker(CEH)认证项目中的一项高级动手实践考试。它不同于传统的理论考试,侧重于在真实环境中检验考生的实操能力。

sgafdgdagd的博客 968

coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 2669

js 数据类型 隐式转换

JS的类型 原始值(primitives): undefined, null, booleans, numbers,strings, symbol(es6) 对象值(objects): Object 什么时候回出触发隐式转换?大概有几种情况 1. (==)比较 怎么转换 ,js高级编程给出以下 ①、如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而tr...

qq_27315289的博客 384

2026年【江苏“信息与未来”编程思维】真题及题解(T6:桌面游戏)

2026年【江苏“信息与未来”编程思维】真题及题解(T6:桌面游戏)

王老师青少年编程 534

JavaScript中的this指向问题

JavaScript中的this是让很多开发者头疼的地方,而this关键字又是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。 想要理解this,你可以先记住以下两点: 1:this永远指向一个对象; 2:this的指向完全取决于函数调用的位置; 针对以上的第一点特别好理解,不管在什么地方使用this,它必然会指向某个对象;确定了第一点后,也引出了一个问题,就是this使用的地方到底在哪里,而第二点就解释了这个问题,但关键是在JavaScript语言之中,一切皆对象,运行环境也

weixin_43758377的博客 1434

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

笔试题-2023-芯原-数字前端设计or验证【纯净题目版】

w0shishabi的博客 5685

电磁场仿真软件:COMSOL Multiphysics_(17).时域与频域分析

时域和频域分析是电磁场仿真中非常重要的两种方法,每种方法都有其独特的应用场景和优势。时域分析适用于瞬态响应和宽带信号的分析,而频域分析则适用于稳态响应和窄带信号的分析。在COMSOL Multiphysics中,通过合理设置物理场接口、材料属性、边界条件、网格划分和求解器,可以高效地进行这两种分析,并通过傅里叶变换将时域结果转换为频域结果,进一步拓展仿真应用的范围。合理的性能优化措施,如网格划分优化和并行计算,可以显著提高仿真的效率和准确性。

kkchenjj的博客 1976

汇编语言---常用伪指令

汇编语言---常用伪指令   一、内存单元别名定义伪指令THIS 在程序中,如果需要以另外一种数据类型来访问同一存储单元时,可用强制类型转换操作符PTR来实现.但是,如果在程序中药经常以某种其它数据类型来访问同一存储单元的话,就必须在每次访问时都要加上强制

3851

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

转载 在Javascript面向对象的编程中我们常常会见到这三个关键字:this、prototype、constructor。...

011-04-12 11:09:05|分类:Javascript|标签:javascriptprototypeconstructor|字号订阅 在Javascript面向对象的编程中我们常常会见到这三个关键字:this、prototype、constructor。对这三个关键字的理解是对Javascript面向对象编程理解的要点...

anyixian3728的博客 164

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

前端面试中的this问题

this问题 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 出自: 追梦子博客 例子1: function a(){ var user = "追梦子"; console.log(this.user); //undefined console.log(this); //Window ...

weixin_33958585的博客 494

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【JS】Javascript中的this到底是什么

JavaScript中的this是一个对于新手来说特别吓人并且不友好的概念。对于一个前端萌新来说,这个概念既模糊,又看不到它存在的意义。本文将解析JavaScript中的this,并且逐一分析他在每个常见场景中的意义和指向。

a1611107035的博客 3273

JS中的this详解

JS中的this 背景 JS中的this指向问题,一直以来自己并不是十分的清楚,平时在开发中使用时到是也能正常应用,但是对其使用和判断并不能信手拈来,所以自己搜索了一些资料,总结了一下,也希望对大家有所帮助。 目录 什么是this? this的指向 为什么要使用this? 什么的this? this,从字面上含义是“这个”, 所以在JS中this表示的就是当前对象,但这个“当前对象”到底指的是哪个对象,是由运行时所在的上下文环境决定的。 简言之:当前是谁调用了我,我就指向谁; this:表示当前对象。

weixin_42321292的博客 1万+

JavaScript对象中的this指向及其修改

1、属性事件的this,在标签内调用事件函数 ①谁调用this所在的函数,就指向谁 a、如果this作为参数传入,那么this就是指向input b、如果不在标签的方法中传入this,那么方法中打印this时一般指向window 2、onclick事件中的this(返回该标签) 3、构造函数中的this(this指向当前实例化的具体的对象(谁调用this所在...

前端技术分享 5263

再说 JavaScript中this 对象 (超详细)

在 JavaScript 中,this是一个非常特殊且灵活的关键字,它的值取决于,即代码执行时的具体环境。this的值不在编写时静态决定,而是在,它会指向当前函数执行的。以下是对this的详细理解。

Sherry Tian的博客 2816

关于JS中this对象指向问题总结

关于JS中this对象指向问题,相信做过项目的小伙伴多多少少都会遇到过,明明感觉代码写的没问题,可是运行的时候,就会报错,比如报错 xxx is not a function。我最近也遇到了,百度学习了不少前辈对于this对象指向问题的解析,于是总结了这篇文章。

铁锤妹妹的博客 4683

js进阶——this和对象原型

this是 JavaScript 中一个强大但有时难以理解的机制,其值取决于函数调用的方式。原型机制和原型链是 JavaScript 中对象继承的基础,构成了对象与函数的继承关系。深入理解this和对象原型可以帮助你更好地掌握 JavaScript 的复杂机制,在构建复杂应用程序时写出更清晰、可维护的代码。

2301_79858914的博客 1013

一文看懂javascript(js)的this和Vue中的this

this是Javascript语言中的一个关键字,它代表函数运行时自动生成的一个内部对象,指当前对象,因此this只能在函数内部使用。随着函数执行环境的改变,this所指代的对象也会发生改变,但this始终指向的是调用函数的对象。简单来说就是谁调用了这个函数,this就指向谁(对象)。方法区别call既可以调用函数又可以传参数,参数只需用逗号隔开apply既可以调用函数又可以传参数,参数需要用一个数组进行包裹bind。

2301_76179969的博客 1733

js中this对象 及其作用

this对象 this对象在js中是一个特殊的存在 它总是指向它所属的对象,它拥有的不同的值取决于它的不同的位置,一般情况下有一下几种: 在方法中this所指的是其所有者的对象,一般用来建造构造函数。 在单独使用的情况下,this一般指的全局对象,一般都是浏览器对象window。 在函数中 this指...

你若成风,我则化雨 1200

javascript中this对象的理解

在一般情况下,this对象指的是谁一般取决于函数被调用的方式,在js中,函数有4种调用方式: 1.直接调用,在一般函数中使用this指代全局对象-window. function test(){     this.x = 1;     alert(this.x); //此时的this为window对象   }   test(); // 1 2.某个对象的方法调用,this指的是这个上级对...

u013594477的专栏 441

【JavaScript】this 指向

① 默认绑定:在全局中声明的变量和函数(默认指向Window);函数独立调用时(声明式函数、匿名函数 / 赋值式的方式、闭包)(都是指向Window);立即执行函数、 setTimeout、setInterval 指向 window对象调用(也就是谁调用就是指向谁,所以就是指向调用这个函数的对象)(存在隐式丢失的问题:函数赋值和参数赋值的情况);绑定的事件处理函数(指向的是绑定事件处理函数的标签);(指向第一个参数)构造函数中的this指向实例化出来的对象;

athicket 1609

【前端】JavaScript 中的 this 与全局对象 window深度解析

在 JavaScript 中,this 是一个极为重要且复杂的关键字,其灵活的特性常常让初学者甚至中级开发者感到困惑,特别是在不同环境中,this 的指向可能会发生显著变化。在浏览器环境下,this 在全局作用域中通常指向 window 对象,这一点对于初次接触 JavaScript 的开发者来说尤其难以理解。本文将深入探讨 JavaScript 中 this 的工作原理,并解释为什么全局变量在浏览器中会成为 window 对象的属性。此外,我们还将分析严格模式下 this 的 2024.12.2-✍

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 1550
上一篇: Javascript学习笔记16 Comet WebSockets
下一篇: Javascript 函数中This的绑定形式(转载)
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值