在学习"$(this)和this"过程中遇到的一点疑惑!

在学习JQuery的过程中,我遇到了$(this),this,通过查阅网上资料,我发现大部分来源中对于它们的解释基本一致,其最终来源似乎都来自一位叫做Remy Sharp的程序员的一篇文章https://remysharp.com/2007/04/12/jquerys-this-demystified ,其中我发现了一些解释并不够清楚的地方,写下来与各位讨论。

以下是在查阅资料过程过发现的一个例子:

$("#desktop a img").each(function(index){
  alert($(this));      //[object Object ]  alert(this);         //[object HTMLImageElement]})

其中说到this表示的是一个html对象(或元素),$(this)表示的是一个JQuery对象,但我觉得这种说法并不够准确,根据对this的一种定义:

在函数内部,有两个特殊的对象:arguments和this。即是说,this作为函数的一个内部属性引用的是函数据以执行操作的对象——或者也可以说,this是函数执行时所处的作用域(当在网页的全局作用域中调用函数时this对象引用的就是window)1

也就是说,在实际的实用过程中,this指代的是一个html对象。

而对于$(this)来说,它不仅是一个JQuery对象,更准确的说它是一个包装集,请看下面的解释:

为了使设计和内容分离而把CSS引入Web技术中,需要以某种方式从外部样式表中引入页面元素组。开发出来的方法就是通过使用选择器。例如,选择器

p a

JQuery利用同样的选择器,不仅支持目前的CSS中使用的常见选择器,还支持大多浏览器尚未实现的选择器,如
         $(selector)
    或者
         jQuery(selector)
    其中$()函数返回特别的Javascript对象,它包含着与选择器相匹配的DOM元素的数组,该对象拥有大量预定义的方法(如attr())。

用编程的话来说,这种构造称为包装器,因为它用扩展功能来对匹配的元素进行包装。我们使用属于jQuery包装器或者包装集,来指能够在其上用jQuery定义的方法去操作的、匹配元素的集合。2

从上面可以看出,$(this)得到的其实是一个数组,换句话说是一个包装集,如果想要模拟this的效果,可使用$(this)[0]或者$(this).get(0);同时也解释了为什么this.attr()会发生错误,以及在下例中,不能讲this换成$(this)的原因:

$("#textbox").hover(
   function() {
      this.title = "Test";
   }

   function() {
      this.title = "OK";
   }
);

1、参考《Javascript高级程序设计第二版》5.5.4 函数内部属性;

2、参考《jQuery实战》1.3.1 jQuery包装器。

时间: 2024-11-10 02:22:28

在学习"$(this)和this"过程中遇到的一点疑惑!的相关文章

在学习“contains()和compareDocumentPositon()"过程中遇到的一点疑惑!

JS开发人员经常都需要确定某个节点是否包含另一个节点,由此IE率先引入了contains()函数,随后,Safari3及其更高版本,Opera 8及其更高版本,Chrome都支持了这个方法(Safari 2.x中虽然也支持这个方法,但无法正常使用).FireFox不支持这个方法,但在DOM3中提供了一个替代方法compareDocuemntPosition().由于此种原因,要想跨平台确定某个节点是否包含另一个节点,就必须提供一个通用的contains()函数来解决这种差异,通常的解法方法如下:

Ubuntu14.04安装mysql及过程中遇到的一点小问题

Ubuntu14.04出来有段时间了,前几天刚升级到这个版本,新鲜了一把.不过安装mysql时遇到了一点小问题,记录一下以备后用. 预备操作: 网上安装mysql的方法不少,大体有这么三种. 1. 从网上安装 sudo apt-get install mysql-server.装完已经自动配置好环境变量,可以直接使用mysql的命令. 2. 安装离线包,以mysql-5.0.45-linux-i686-icc-glibc23.tar.gz为例. 3. 二进制包安装:安装完成已经自动配置好环境变量

关于学习C#泛型委托过程中发现的一些疑惑,大家一起讨论下

大家知道泛型委托Action,是定义一个没有返回值的委托. 例如: public Action<int, int> AddAction = (x, y) => { Console.WriteLine(x+y); }; 定义一个Action 可以在Action上F12进入可以看到源码为: public delegate void Action<T1, T2>(T1 arg1, T2 arg2); 这里发现一个问题,T1,T2是什么类型呢,在哪里定义的,我按F12并没有找到对应的

C++中map的一点疑惑...

int CRuntimePara::getInt(const string& strKey,int iDefault){ map<string,string>::const_iterator iter; if ((iter = _mapParaValue.find(strKey)) != _mapParaValue.end()) return atoi((*iter).second.c_str()); else return iDefault;} _mapParaValue.end()

Android APP 调试过程中遇到的问题。

调试过过程中APP安装完启动后有的时候会异常退出,报这个错误.有的时候可以直接启动.查找不到原因.网上说把commit方法替换成commitAllowingStateLoss() 也无效. Android APP 调试过程中遇到的问题. >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007192169/AndroidAPP调试过程中遇到的问题.html

机器学习算法推导过程中的数据基础知识

1.向量.矩阵求导 当然了,这里补充一下求解过程中的关于向量.矩阵求导的几个公式: 这里其实只需要明白第一个,后边的三个都可以由第一个简单的推导而来. 注意这里对列向量AX的每一项的求导写为行,不然就会得到一个超越矩阵,我们不采用这种方式.

编译过程中,termcap.h 文件找不到路径 licli.a终于生成

编译过程中,termcap.h      文件找不到路径 查看是linux  源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termcap.h  发现一篇文章,如下 ----------------------------------------------------------------------------------------- 安装minicom2.3出现termcap.h错误解决方法 2010-05-06 17:12:

懒加载(延迟加载)之后,在使用数据过程中容易出现的bug

在UI中,使用懒加载,也就是延迟加载来加载数据的时候,总是会面临几个问题? 如:1. >为什么先创建NSArray属性? 2. >为什么重写NSArray的get方法? 3.>为什么要判断是否为空? 4.>为什么下方代码"//1"这里不用NSString stringWithFormat: 而"//2"这里要使用? 5.>同时"//2"这里为什么使用的是%ld 来作为占位符? 这些问题不搞懂,懒加载就很难通透,  代

SQL安装过程中“针对SQL Server 注册表的一致性验证“出错解决方式

1.打开注册表,查找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\0804],分别打开Counter 和Help 2.打开Counter,把滚动条拉倒最后,然后记下最大的那个值(不同计算机不一样的),记下后关闭窗口 3.同样的打开Help,滚动到最后记最大的那个值(你们的值不一定跟我一样的哦!!!),记下后关闭窗口 4,再重新定位到Perflib的节点上, 5.双击Last Counter然后在