详谈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 相关文章推荐
解密效果
Jun 23 Javascript
Jquery 学习笔记(一)
Oct 13 Javascript
更换select下拉菜单背景样式的实现代码
Dec 20 Javascript
javascript 常见功能汇总
Jun 11 Javascript
JS表格组件神器bootstrap table详解(强化版)
May 26 Javascript
Vue过滤器的用法和自定义过滤器使用
Feb 08 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
编写React组件项目实践分析
Mar 04 Javascript
Vue面试题及Vue知识点整理
Oct 07 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
Sep 06 Javascript
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
风味层面去分析咖啡油脂
2021/03/03 咖啡文化
Yii快速入门经典教程
2015/12/28 PHP
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JavaScript的Date()方法使用详解
2015/06/09 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
jquery.form.js异步提交表单详解
2017/04/25 jQuery
Vue.directive()的用法和实例详解
2018/03/04 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
[03:49]DOTA2英雄基础教程 光之守卫
2014/01/14 DOTA
Python中实现字符串类型与字典类型相互转换的方法
2014/08/18 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
2018/02/07 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
TensorFlow车牌识别完整版代码(含车牌数据集)
2019/08/05 Python
Python如何实现FTP功能
2020/05/28 Python
python爬虫分布式获取数据的实例方法
2020/11/26 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
竞聘副主任科员演讲稿
2014/01/11 职场文书
大学考试作弊检讨书
2014/01/30 职场文书
环境科学专业优秀毕业生自荐书
2014/02/03 职场文书
应聘文员自荐信范文
2014/03/11 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
学校工作推荐信范文
2014/07/11 职场文书
师范毕业生求职信
2014/07/11 职场文书
家属联谊会致辞
2015/07/31 职场文书
游戏开发中如何使用CocosCreator进行音效处理
2021/04/14 Javascript