详谈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 相关文章推荐
Three.js源码阅读笔记(物体是如何组织的)
Dec 27 Javascript
javascript中的toFixed固定小数位数 简单实例分享
Jul 12 Javascript
JavaScript获取浏览器信息的方法
Nov 20 Javascript
完美实现js拖拽效果 return false用法详解
Jul 28 Javascript
Angular自定义组件实现数据双向数据绑定的实例
Dec 11 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 Javascript
vue中rem的配置的方法示例
Aug 30 Javascript
JS实现获取自定义属性data值的方法示例
Dec 19 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
浅谈如何优雅处理JavaScript异步错误
Nov 12 Javascript
Vue组件通信$attrs、$listeners实现原理解析
Sep 03 Javascript
vue穿梭框实现上下移动
Jan 29 Vue.js
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 echo 输出字符串函数详解
2010/05/13 PHP
PHP 断点续传实例详解
2017/11/11 PHP
php intval函数用法总结
2019/04/14 PHP
php设计模式之装饰模式应用案例详解
2019/06/17 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
jquery tools 系列 scrollable(2)
2009/09/06 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
JS随机调用指定函数的方法
2015/07/01 Javascript
JS实现具备延时功能的滑动门菜单效果
2015/09/17 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
浅析Vue项目中使用keep-Alive步骤
2018/07/27 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
深入理解Python爬虫代理池服务
2018/02/28 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
使用python对excle和json互相转换的示例
2018/10/23 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
2020/02/23 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
工程地质勘察专业大学生求职信
2013/10/13 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
保险内勤岗位职责
2015/04/13 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA