JQuery this 和 $(this) 详解
this
this 在面向对象语言中,指代调用上下文对象,在js中,也是一模一样的概念,所以不管这个this出现在什么地方,只要追踪到当前调用对象是什么,那么this是什么也就一目了然了。
先看一个简单示例
(function(){
console.log("Normal function being invoked by: "+ this);
})();
输出: Normal function being invoked by: [object Window]
这是个普通匿名函数,当运行这段代码,谁是宿主对象呢,对, 全局变量window, 所以这里的this 就是 window
不过请注意如果是在严格模式下,这里的this是undefined, 下面代码可以验证
(function(){
'use strict';
console.log("Normal function in strict: "+ this);
})();
输出:Normal function in strict: undefined
上面的用法很傻,更常用的方式是在自定义的对象中用this指代自身,例如
var o = { name: "Frank",
sayName : function (){console.log(this.name)}}
o.sayName();
输出:Frank
还有一个更实用的用法,是在函数中指代一个“未知的”调用上下文,也就是在定义函数时用到了this,但是这个函数被谁调用,我还不清楚,请在运行时自行绑定,这种用法在回调(callback)中很普遍,而实现这种函数和对象的动态关联,是通过函数的call( )和 apply( ) 方法实现的,看例子
var o = { name: "Frank", age: 21}
function sayAge(){
console.log("My age is "+this.age)// 这个this 表示哪个对象调用我,我就是谁
}
sayAge.call(o); //当前上下文是 o, 所以age是21
sayAge(); //当前上下文是 Window, Window没有age这个属性,所以是undefined
输出:
My age is 21
My age is undefined
OK, 理解了this,那么$(this) 就很简单了,在jQuery中,其作用就是将DOM对象wrap成一个jQuery对象,看个例子
<script src="jQuery.js" type="text/javascript"></script>
<script>
$(function() {
$('div').each(function(){
this.style.color = "blue"; // this here is DOM element, because this function is fired by in the context of the current DOM element
$(this).css( "color", "red" ); // use $(this) to wrap it to be jQuery object
});
});
</script> <html>
<body>
<div> Sample 1 </div>
<div> Sample 2 </div>
</body>
</html>
此例中,each的参数是一个匿名的callback函数,其中的this就是前面介绍过的用法,指代运行时的调用对象,详细参见: http://api.jquery.com/each/
jQuery是怎么做到的呢? 看一下源码,很简单的
each: function( obj, callback, args ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj );
if ( args ) {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.apply( obj[ i ], args );
if ( value === false ) {
break;
}
}
}
// A special, fast, case for the most common use of each
} else {
if ( isArray ) {
for ( ; i < length; i++ ) {
// 就是这里了,通过call将执行callback函数的上下文设置为obj[i], 因为this指代函数运行时,invoke函数的对象(上下文),所以此时的this也就是obj[i]。而obj[i] 就是jQuery对象(数组)中的DOM对象,第二个参数是index,第三个参数基本不用,因为就是this
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) { // 如果你想终止loop,只要在回调函数中返回false就可以了
break;
}
}
} else {
for ( i in obj ) {
value = callback.call( obj[ i ], i, obj[ i ] );
if ( value === false ) {
break;
}
}
}
}
return obj;
},
版权声明:本文为博主原创文章,未经博主允许不得转载。
JQuery this 和 $(this) 详解的更多相关文章
- jQuery Validate验证框架详解
转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...
- jQuery的deferred对象详解
jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...
- jQuery的deferred对象详解(转载)
本文转载自: jQuery的deferred对象详解(转载)
- 触碰jQuery:AJAX异步详解
触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML( ...
- jQuery调用AJAX异步详解[转]
AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1) 使用CSS和X ...
- jQuery的deferred对象详解(一)
最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面 ...
- 触碰jQuery:AJAX异步详解(转)
AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1) 使用CSS和X ...
- 【转】jQuery Validate验证框架详解
jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type=& ...
- jQuery form插件使用详解
点击打开: jquery选择器全解 jquery中的style样式操作 jquery中的DOM操作 jquery中的事件操作全解 jquery中的动画操作全解 jquery中ajax的应用 自定义jq ...
- [转] jQuery的deferred对象详解
jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...
随机推荐
- java.outOfMemory
http://www.kdgregory.com/index.php?page=java.outOfMemory Java Platform, Standard Edition HotSpot Vir ...
- osip结构体
/** * Structure for SIP Message (REQUEST and RESPONSE). * @struct osip_message */ struct osip_messa ...
- Maven学习3-使用Maven构建项目
转自:http://www.cnblogs.com/xdp-gacl/p/4240930.html maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项 ...
- IIS-Server is too busy _解决方法
httpRuntime Server Too Busy 修改方法:修改服务器.net配置“machine.config"文件,该文件位于Windows系统目录下,如“C:\WINDOWS \Micro ...
- 12 Linux下crontab详解
1. 概述: crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进 ...
- silverlight简单数据绑定2
<Grid x:Name="LayoutRoot" Background="white" Loaded="LayoutRoot_Loaded&q ...
- Error: Error #2014: Feature is not available at this time. at flash.filesystem::File$/initDocumentsDir()
Error: Error #2014: Feature is not available at this time. at flash.filesystem::File$/initDocumentsD ...
- Android自学笔记:环境配置
Info: 自学Android之旅第二篇,初步学习会有疏漏,以后我会不断修改补全,直到完美. 2014-10-09:初版 2014-11-12: 重新配置了一台电脑,更新在学习robotium过程中, ...
- phpexcel导入excel表格
html代码 <form action="{:U('Mall/updExcel')}" method="POST" enctype="multi ...
- git branch 管理常用命令
查看本地分支 git branch * dev master *代表当前位于dev分支 查看远程分支 git branch --remote origin/dev origin/master 查看远程 ...