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. mysql加单引号和不加单引号的性能比较

    刚刚我们说过了,生活中难免会有一些不如意,比如,我们用一个字符串类型的字段来作为主键,表面上,这太不如意了,然而,事实也证明这是有用的.问题也就出来了,当在查询语句中对该字段值加上单引号和不加查询耗时 ...

  2. android中的AIDL进程间通信

    关于IPC应该不用多介绍了,Android系统中的进程之间不能共享内存,那么如果两个不同的应用程序之间需要通讯怎么办呢?比如公司的一个项目要更新,产品的需求是依附于当前项目开发一个插件,但是呢这个插件 ...

  3. [solr] - defType - 查询权重排序

    Solr的defType有dismax/edismax两种,这两种的区别,可参见:http://blog.csdn.net/duck_genuine/article/details/8060026 下 ...

  4. 一加3,CM13蓝牙共享互联网 无效。

    一加3准备把4G网络共享给魅族PRO5. 但在一加3的蓝牙设置里怎么勾选都无用. 最后发现在要在PRO5上设置才行. 1.在蓝牙列表中,点击带圈的感叹号. 2.选择“互联网访问”. - --

  5. Maven进价:Maven构建错误汇总

    问题:The method of type must override asuperclass? annotation:@Override的原因 办法:项目右键->build path-> ...

  6. Android学习笔记(八)

    android中常见空间的使用方法 1.TextView TextView主要用于在界面上显示一段文本信息,如下面代码所示: <LinearLayout xmlns:android=" ...

  7. css学习笔记(6)

    +++++++++++++++++ CSS HACK+++++++++++++++++IE6.0 能识别 _background:#ff00ff; *background:#ff00ff; +back ...

  8. Fighting Game

    感谢上外静中任淳同学提供   uses crt; label   h;         //h是重新开始游戏 const   y1=18;   y2=18;       //p1,p2的纵坐标 var ...

  9. tar打包排除某个目录

    tar zcvf fd.tar.gz * --exclude=file1 --exclude=dir1 注意: 1.--exclude=file1 而不是 --exclude file1 2.要排除一 ...

  10. 利用反射及JDBC元数据编写通用查询方法

    元数据:描述数据的数据,ResultSetMetaData是描述ResultSet的元数据对象,从它可以得到数据集有多少了,每一列的列名... ResultSetMetaData可以通过ResultS ...