详解js和jquery里的this关键字
详解js和jquery里的this关键字
js
中的this
我们要记住:this
永远指向函数运行时所在的对象!而不是函数被创建时所在的对象。this
对象是在运行时基于函数的执行环境绑定的,在全局环境中,this
等于window
先来看个例子:
<script>
var fullname = "Trigkit4";
var person = {
fullname : 'Jack',
prop:{
fullname : 'Blizzard',
getFullname : function () {
return this.fullname;
}
}
};
console.log(person.prop.getFullname());//Blizzard
var test = person.prop.getFullname;
console.log(test());//Trigkit4
</script>
当getFullname
被分配到test
变量时,上下文指的是全局对象(window)
。这是因为test
是被隐式设置为全局对象的属性。出于这个原因,该函数返回window
的fullname
,所以在这里 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()
,然后创建两个对象oCar1
和oCar2
,一个对象属性被设置为"red
",另一个为blue
;两个对象都被赋予了属性showColor
,指向原始的showColor()
函数,调用每个showColor
的方法,oCar1
输出red
,oCar2
输出blue
。
引用对象属性时,必须使用
this
关键字。
所有基于全局作用域的变量其实都是window
对象的属性(property)。这意味着即使是在全局上下文中,this
变量也能指向一个对象。
对于 JScript
的客户版本,如果在其他所有对象的上下文之外使用 this
,则它指的是 window
对象。
例如:
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
<script type="text/javascript">
alert(this);//弹出 object window;
</script>
</head>
<body>
</body>
作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this
就指这个新对象。
<script type="text/javascript">
function test(){
this.x = 10;
}
var obj = new test();
alert(obj.x); //弹出 10;
</script>
全局环境中的this
在看下面一个this
出现在全局环境中的例子:
<script type="text/javascript">
var name = "全局";
function getName(){
var name = "局部";
return this.name;
};
alert(getName());//弹出 全局;
</script>
函数getName()
所处的对象是window
对象,因此this
也一定在window
对象中。此时的this
指向window
对象,所以getName()
返回的this.name
其实是window.name
,因此alert
出全局。
结论:无论this
身处何处,一定要找到函数运行时(或者说在何处被调用 了)的位置。
通过不同的调用语法,改变相同函数内部this
的值:
<script type="text/javascript">
var foo = {
test:function(){
alert(this);
}
}
foo.test();//object,因为test方法在调用时属于foo对象
var baz = foo.test;
baz();//window,因为baz()被调用时属于global对象
</script>
局部环境中的this
看下面一个this
出现在局部环境中的例子
<script type="text/javascript">
var name = "全局";
var jubu={
name:"局部",
getName:function(){
return this.name;
}
};
alert(jubu.getName());
</script>
其中this
身处的函数getName
不是在全局环境中,而是处在jubu环境中。无论this
身处何处,一定要找到函数运行时的位置。此时函数getName
运行时的位置:
alert(jubu.getName());
显然,函数getName
所在的对象是jubu
,因此this
的安身之处定然在jubu
,即指向jubu
对象,则getName
返回的this.name
其实是jubu.name
,因此alert
出来的是“局部”!
作用域链中的this
<script type="text/javascript">
function scoping () {
console.log(this);
return function () {
console.log(this);
};
}
scoping()();
>>window
>> window
</script>
因为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
}
jquery中的this
$()
生成的是什么呢?实际上$()=jquery()
,那么也就是说返回的是一个jquery
的对象。$(this)
是jquery
对象,能调用jquery
的方法,例如click()
, keyup()
。
$(function () {
$('button').click(function () {
alert(this);//this 表示原生的DOM
//$(this)表示当前对象,这里指的是button
})
});
结论:this
,表示当前的上下文对象是一个html DOM
对象,可以调用html
对象所拥有的属性,方法。$(this)
,代表的上下文对象是一个jquery
的上下文对象,可以调用jquery
的方法和属性值。
详解js和jquery里的this关键字的更多相关文章
- 详解JS与Jquery获得的对象的区别与联系
世上无难事只怕有心人,敲代码也一样只要你用心去搞懂一件事,即使一个小小的用法对你以后也会有很大的作用: 项目虽然赶得紧但是有些问题百度找完答案解决之后,也要自己梳理一遍做到心领神会!!!今天就直接来上 ...
- 详解js面向对象编程
转自:http://segmentfault.com/a/1190000000713346 基本概念 ECMA关于对象的定义是:”无序属性的集合,其属性可以包含基本值.对象或者函数.“对象的每个属性或 ...
- 详解js变量、作用域及内存
详解js变量.作用域及内存 来源:伯乐在线 作者:trigkit4 原文出处: trigkit4 基本类型值有:undefined,NUll,Boolean,Number和Strin ...
- js模仿jquery里的几个方法parent, parentUntil, children
有时工作需要, 也是接着上一章的方法, 用js模仿jquery里的几个方法parent, parentUntil, children. function parent(node){ return no ...
- [转]javascript console 函数详解 js开发调试的利器
javascript console 函数详解 js开发调试的利器 分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...
- 详解js的bind、call、apply
详解js的bind.call.apply 说明 虽然bind.call.apply都是js很基础的一块知识,但是我从未认真总结过这三者的区别. 由于公司后端是用的微服务架构,又没有中间层对接,导致前端 ...
- Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串
Jquery 选择器 详解 在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...
- 详解js中的闭包
前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...
- js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug
URL 说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...
随机推荐
- Mac编程(QT有许多专门的资料)
Mac OS X 上在应用运行时,在Dock上的图标右键会有额外的菜单部分.参考iTunes运行时右键的菜单.使用Qt在Mac下的一个set_menu(QMenu *)函数实现,文档里有写 http: ...
- 为右键添加快速进入CMD的选项,Win7更简单
最近频繁的ping服务器,远程服务器,一直打开cmd好麻烦,就想到了之前调试perl的时候,用到的一个方法,在文件夹右键添加一个进入CMD的选项.当时的实现方法如下: 在右键菜单中添加 Dos 窗体 ...
- 最新Android ADT, SDK, SDK_tool等官方下载说明(及时更新)
1.Android SDK starter package SDK starter package http://dl.google.com/android/installer_r08-windows ...
- NAT简单介绍
NAT本质就是让一群机器公用同一个IP.还有一个重要的用途是保护NAT内的主机不受外界攻击 NAT类型: 1.Full Cone:IPport不受限 Full Cone仅仅做单纯的地址转换,不正确进出 ...
- CKEditor和CKFinder整合实现上传下载功能
CKEditor与CKFinder整合并实现文件上传功能 事先说明:此整合的是java版本号的, 用到的有:jsp + ckeditor + ckfinder (没有servlet 及其他框架技术) ...
- 《数据通信与网络》笔记--虚电路网络:帧中继和ATM
在之前的文章中已经介绍过虚电路交换,详细请参见:http://blog.csdn.net/todd911/article/details/9069447 这边介绍下使用虚电路交换的2中WAN技术:帧中 ...
- filter过滤器的使用
从J2EE1.3开始,Servlet2.3规范中加入了对过滤器的支持.过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种,下面让我们分别来看看这四种过滤器的工作方式: 1.reques ...
- CentOS 6.4安装(超级详细图解教程)
链接地址:http://www.osyunwei.com/archives/5855.html CentOS 6.4安装(超级详细图解教程) 附:CentOS 6.4下载地址 32位:http://m ...
- 纯JAVA驱动:sqlserver版本不同,驱动与连接也有所区别
纯JAVA驱动:// 2005 版本:驱动:Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");连接:”jd ...
- 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)
F - Strange Way to Express Integers Time Limit:1000MS Memory Limit:131072KB 64bit IO Format: ...