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) 详解的更多相关文章

  1. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  2. jQuery的deferred对象详解

    jQuery的deferred对象详解请猛击下面的链接 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_ ...

  3. jQuery的deferred对象详解(转载)

    本文转载自: jQuery的deferred对象详解(转载)

  4. 触碰jQuery:AJAX异步详解

    触碰jQuery:AJAX异步详解 传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML( ...

  5. jQuery调用AJAX异步详解[转]

    AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1)   使用CSS和X ...

  6. jQuery的deferred对象详解(一)

    最近一段时间,都在研究jquery里面的$.Deffered对象,几天都搞不明白,其中源码的运行机制,网上查找了相关的资料,<jQuery的deferred对象详解>阮一峰老师的文章,里面 ...

  7. 触碰jQuery:AJAX异步详解(转)

    AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).它并非一种新的技术,而是以下几种原有技术的结合体. 1)   使用CSS和X ...

  8. 【转】jQuery Validate验证框架详解

    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一.导入js库 <script type=& ...

  9. jQuery form插件使用详解

    点击打开: jquery选择器全解 jquery中的style样式操作 jquery中的DOM操作 jquery中的事件操作全解 jquery中的动画操作全解 jquery中ajax的应用 自定义jq ...

  10. [转] jQuery的deferred对象详解

    jQuery的开发速度很快,几乎每半年一个大版本,每两个月一个小版本. 每个版本都会引入一些新功能.今天我想介绍的,就是从jQuery 1.5.0版本开始引入的一个新功能----deferred对象. ...

随机推荐

  1. Waves:类Material Design 的圆形波浪(涟漪)点击特效插件

    Waves:类Material Design 的圆形波浪(涟漪)点击特效插件 2014/08/06 分类:前端开发, 素材分享 浏览:6,734次  来源:原创 1个评论       6,734   ...

  2. 获取 .net framework 路径

    要获取当前程序所使用的.netframework路径: System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory(); ...

  3. Redis 初

    tcl8.6.1 $wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz $tar xzvf tcl8.6.1-src.tar.g ...

  4. VS中Debug和Realease、及静态库和动态库的区别整理

    一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...

  5. oracle返回多个参数

    CREATE OR REPLACE PACKAGE BODY get_form_no_pub IS /*================================================ ...

  6. [Spring MVC] - SpringMVC的各种参数绑定方式

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...

  7. js合并行

    网上找了好久才找到,在这记录下. <script type="text/javascript" > function MergerRow(ID) { var tab = ...

  8. HTML5外包

    北京动点飞扬软件 从事html5外包业务五年,是国内第一家以HTML5移动平台.手机平台项目外包业务为主的正规软件团队, 欢迎联系 QQ:372900288 电话:13911652504 我们现已发展 ...

  9. ASP.NET学习笔记1—— MVC

    MVC项目文件夹说明 1.App_Data:用来保存数据文件 2.App_Start:包含ASP.NET-MVC系统启动的相关类文件 3.Controllers:存放整个项目"控制器&quo ...

  10. git 服务器的搭建

    文章转载地址:http://www.linuxidc.com/Linux/2015-05/117502.htm 亲测可行,已经自己搭建一个正在使用中,搭建完成后,结合着pycharm +git,就能直 ...