详谈jQuery中的this和$(this)


Posted in Javascript onNovember 13, 2014

网上有很多关于jQuery的this和$(this)的介绍,大多数只是理清了this和$(this)的指向,其实它是有应用场所的,不能一概而论在jQuery调用成员函数时,this就是指向dom对象。

$(this)指向jQuery对象是无可厚非的,但this就是指向dom对象,这个是因为jQuery做了特殊的处理。 

在创建dom的jQuery对象时,jQuery不仅仅为dom创建一个jQuery对象,而且还将dom存储在所创建对象的数组中。

elem = document.getElementById(match[2]);  

if (elem && elem.parentNode) {  

  this.length = 1;  

  this[0] = elem;  

}  

  

this.context = document;  

this.selector = selector;  

return this; 

 this[0] = elem这条语句就是实现对象数组。所以javascript是很有意思的语言,使用this访问时,可以访问它所指向的对象的成员函数,而其实this又是一个对象数组。其存放的是dom对象。

先看看 $("p").each() -- 循环

each: function( callback, args ) {  

        return jQuery.each( this, callback, args );  

    } 

 看了each函数的调用大家应该明白,jQuery.each( this, callback, args );调用的是对象数组,而对象的数组存储的是dom对象,因此在callback函数中的this自然是dom对象了

再看看$("p").hide() -- 成员函数

hide: function() {  

        return showHide( this );  

    },  

 function showHide( elements, show ) {var elem, display,  

        values = [],  

        index = 0,  

        length = elements.length;  

    for ( ; index < length; index++ ) {  

        elem = elements[ index ];  

        if ( !elem.style ) {  

            continue;  

        }  

        values[ index ] = jQuery._data( elem, "olddisplay" );  

        if ( show ) {  

            // Reset the inline display of this element to learn if it is  

            // being hidden by cascaded rules or not  

            if ( !values[ index ] && elem.style.display === "none" ) {  

                elem.style.display = "";  

            }  

            // Set elements which have been overridden with display: none  

            // in a stylesheet to whatever the default browser style is  

            // for such an element  

            if ( elem.style.display === "" && isHidden( elem ) ) {  

                values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );  

            }  

        } else {  

            display = curCSS( elem, "display" );  

            if ( !values[ index ] && display !== "none" ) {  

                jQuery._data( elem, "olddisplay", display );  

            }  

        }  

    }  

    // Set the display of most of the elements in a second loop  

    // to avoid the constant reflow  

    for ( index = 0; index < length; index++ ) {  

        elem = elements[ index ];  

        if ( !elem.style ) {  

            continue;  

        }  

        if ( !show || elem.style.display === "none" || elem.style.display === "" ) {  

            elem.style.display = show ? values[ index ] || "" : "none";  

        }  

    }  

    return elements;  

} 

 从上面的代码可以看出hide行数其实调用的是showHide,而传入的第一个参数this,并不是dom对象,而是jQuery对象数组,因此showHide函数通过循环此对象数组获取每一个dom对象。

最后看看$("p").bind() -- 事件

bind: function( types, data, fn ) {  

        return this.on( types, null, data, fn );  

    }, 
on: function( types, selector, data, fn, /*INTERNAL*/ one ) {  

        // 此部分代码省略  

        return this.each( function() {  

            jQuery.event.add( this, types, fn, data, selector );  

        });  

    }, 

bind函数调用的是 on函数,而on函数又是通过 each函数实现了jQuery.event.add。因此 jQuery.event.add( this中的this也就是dom对象了。所以事件中的this也就是dom对象了。

以上就是个人对于jQuery中this与$(this)的理解了,如有什么纰漏,请联系我或者给我留言

Javascript 相关文章推荐
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
Feb 05 Javascript
javascript中直接写php代码的方法
Jul 31 Javascript
jquery清空表单数据示例分享
Feb 13 Javascript
使用ajaxfileupload.js实现ajax上传文件php版
Jun 26 Javascript
使用Browserify配合jQuery进行编程的超级指南
Jul 28 Javascript
基于jQuery实现页面搜索功能
Mar 26 Javascript
js改变透明度实现轮播图的算法
Aug 24 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
Jun 29 Javascript
jquery实现图片放大点击切换
Jun 06 jQuery
Vue 2.0的数据依赖实现原理代码简析
Jul 10 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
jQuery实现的简单歌词滚动功能示例
Jan 07 jQuery
FF(火狐)浏览器无法执行window.close()解决方案
Nov 13 #Javascript
jquery checkbox 勾选的bug问题解决方案与分析
Nov 13 #Javascript
Javascript window对象详解
Nov 12 #Javascript
a标签的href与onclick事件的区别详解
Nov 12 #Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
Nov 12 #Javascript
JavaScript实现关键字高亮功能
Nov 12 #Javascript
javascript的函数作用域
Nov 12 #Javascript
You might like
PHP 字符串操作入门教程
2006/12/06 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
2017/10/13 PHP
javascript 从if else 到 switch case 再到抽象
2010/07/17 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
jQuery基于BootStrap样式实现无限极地区联动
2016/08/26 Javascript
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
详解webpack+gulp实现自动构建部署
2017/06/29 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
element-ui 的el-button组件中添加自定义颜色和图标的实现方法
2018/10/26 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
Python监控主机是否存活并以邮件报警
2015/09/22 Python
Python爬取京东的商品分类与链接
2016/08/26 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
在Python中append以及extend返回None的例子
2019/07/20 Python
用python批量下载apk
2020/12/29 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
美国椅子和沙发制造商:La-Z-Boy
2020/10/25 全球购物
什么是Smart Navigation?
2016/07/03 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
结婚喜宴主持词
2014/03/14 职场文书
课程设计感想范文
2015/08/11 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
react 项目中引入图片的几种方式
2021/06/02 Javascript
基于JavaScript实现省市联动效果
2021/06/22 Javascript