资讯专栏INFORMATION COLUMN

详解js和jquery里的this关键字

LoftySoul / 1759人阅读

摘要:出于这个原因,该函数返回的,所以在这里指的是,所以返回的是第一个说明关键字通常在对象的构造函数中使用,用来引用对象。重写无法重写,因为它是一个关键字。结论,表示当前的上下文对象是一个对象,可以调用对象所拥有的属性,方法。

《javaScript语言精粹》这本书中,把 this 出现的场景分为四类,简单的说就是:

有对象就指向调用对象
没调用对象就指向全局对象
用new构造就指向新对象
通过 apply 或 call 或 bind 来改变 this 的所指。

函数调用模式中,thiswindow;方法调用模式中,this为方法所属的对象;构造器调用模式中,this为创建的新对象。

js中的this

我们要记住:this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象。
this对象是在运行时基于函数的执行环境绑定的,在全局环境中,this等于window

先来看个例子:


getFullname被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回windowfullname,所以在这里 this 指的是window, 所以返回的是第一个fullname

说明

this 关键字通常在对象的 构造函数中使用,用来引用对象。

关键字this:总是指向调用该方法的对象,如:

var iCar = new Object();
iCar.color = "red";
iCar.showColor = function(){
     alert(this.color);//输出"red"
};

关键字this用在对象的showColor()方法中,在此环境,this等于iCar

使用this是因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。使用this,即可在任意多个地方重用同一个函数。考虑下面的例子:

function showColor(){
     alert(this.color);
}
var oCar1 = new Object;
oCar1.color = "red";
oCar1.showColor = showColor;

var oCar2 = new Object;
oCar2.color = "blue";
oCar2.showcolor = showcolor;

oCar1.showColor();//输出"red"
oCar2.showColor();//输出"blue"

这段代码中,首先用this定义函数showColor(),然后创建两个对象oCar1oCar2,一个对象属性被设置为"red",另一个为blue;两个对象都被赋予了属性showColor,指向原始的showColor()函数,调用每个showColor的方法,oCar1输出redoCar2输出blue

引用对象属性时,必须使用this关键字。

所有基于全局作用域的变量其实都是window对象的属性(property)。这意味着即使是在全局上下文中,this变量也能指向一个对象。

对于 JScript 的客户版本,如果在其他所有对象的上下文之外使用 this,则它指的是 window 对象。
例如:


    
    
    


    


作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。


全局环境中的this

在看下面一个this出现在全局环境中的例子:


函数getName()所处的对象是window对象,因此this也一定在window对象中。此时的this指向window对象,所以getName()返回的this.name其实是window.name,因此alert全局

结论:无论this身处何处,一定要找到函数运行时(或者说在何处被调用 了)的位置。

通过不同的调用语法,改变相同函数内部this的值:


局部环境中的this

看下面一个this出现在局部环境中的例子

其中this身处的函数getName不是在全局环境中,而是处在jubu环境中。无论this身处何处,一定要找到函数运行时的位置。此时函数getName运行时的位置:

alert(jubu.getName());

显然,函数getName所在的对象是jubu,因此this的安身之处定然在jubu,即指向jubu对象,则getName返回的this.name其实是jubu.name,因此alert出来的是“局部”!

作用域链中的this

因为scoping函数属于window对象,自然作用域链中的函数也属于window对象。

对象中的this

可以在对象的任何方法中使用this来访问该对象的属性。这与用new得到的实例是不一样的。

var obj = {
    foo: "test",
    bar: function () {
        console.log(this.foo);
    }
};

obj.bar(); // "test"
重写this

无法重写this,因为它是一个关键字。

function test () {
    var this = {};  // Uncaught SyntaxError: Unexpected token this 
}
apply 和 call 调用以及 bind 绑定

applycall 调用以及 bind 绑定都是指向绑定的对象,


jquery中的this

$()生成的是什么呢?实际上$()=jquery(),那么也就是说返回的是一个jquery的对象。
$(this)jquery对象,能调用jquery的方法,例如click(), keyup()

 $(function () {
   $("button").click(function () {
       alert(this);//this 表示原生的DOM
       //$(this)表示当前对象,这里指的是button
   }) 
});

在许多情况下JQuerythis都指向HTML元素节点。

结论:
this,表示当前的上下文对象是一个html DOM对象,可以调用html对象所拥有的属性,方法。
$(this),代表的上下文对象是一个jquery的上下文对象,可以调用jquery的方法和属性值。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87624.html

相关文章

  • 【连载】前端个人文章整理-从基础到入门

    摘要:个人前端文章整理从最开始萌生写文章的想法,到着手开始写,再到现在已经一年的时间了,由于工作比较忙,更新缓慢,后面还是会继更新,现将已经写好的文章整理一个目录,方便更多的小伙伴去学习。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 个人前端文章整理 从最开始萌生写文章的想法,到着手...

    madthumb 评论0 收藏0
  • Ajax详解

    摘要:当请求完成后注册一个回调函数。该请求是否触发全局处理事件如等,请求发送前的回调函数,用来修改请求发送前,此功能可用来设置自定义头信息,在函数中返回将取消这个请求。例如,为请求指定一个回调函数名。即改变回调函数的,默认就是传入的整个对象。 Ajax Ajax 全称是 asynchronous javascript and xml,并不是新的编程语言,可以说是已有技术的组合,主要用来实现客...

    jokester 评论0 收藏0
  • 详解1000+项目数据分析出来的10大JavaScript错误

    摘要:当未捕获的错误通过处理程序引发的错误,而不是捕获在中被浏览器的跨域策略限制时,会产生这类的脚本错误。例如,如果您将您的代码托管在上,则任何未被捕获的错误将被报告为脚本错误而不是包含有用的堆栈信息。 译者按: null/undefined引发的错误在10大错误中比例很高。而它们很可能导致严重问题,所以要重视起来。 原文: Top 10 JavaScript errors from 10...

    jubincn 评论0 收藏0
  • 前端基础进阶(十五):详解 ES6 Modules

    摘要:下载地址安装一个好用的命令行工具在环境下,系统默认的非常难用,所以我个人比较推荐大家使用或者。下载地址安装在命令行工具中使用查看版本的方式确保与都安装好之后,我们就可以安装了。前端基础进阶系列目录 showImg(https://segmentfault.com/img/remote/1460000009654403?w=1240&h=272); 对于新人朋友来说,想要自己去搞定一个E...

    Lowky 评论0 收藏0

发表评论

0条评论

LoftySoul

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<