详谈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 相关文章推荐
JavaScript 创建对象和构造类实现代码
Jul 30 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
Sep 26 Javascript
JavaScript 创建运动框架的实现代码
May 08 Javascript
js通过八个点 拖动改变div大小的实现方法
Mar 05 Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 Javascript
JQuery中serialize()用法实例分析
Feb 06 Javascript
jQuery 获取多选框的值及多选框中文的函数
May 16 Javascript
vue2 router 动态传参,多个参数的实例
Nov 10 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
原生JS实现前端本地文件上传
Sep 08 Javascript
9种方法优化jQuery代码详解
Feb 04 jQuery
js调用网络摄像头的方法
Dec 05 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
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
php下正则来匹配dede模板标签的代码
2010/08/21 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
javascript中callee与caller的用法和应用场景
2010/12/08 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
javascript date格式化示例
2013/09/25 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
JS中的防抖与节流及作用详解
2019/04/01 Javascript
JS实现的自定义map方法示例
2019/05/17 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
javascript 易错知识点实例小结
2020/04/25 Javascript
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
解决python2.7用pip安装包时出现错误的问题
2017/01/23 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
详解python uiautomator2 watcher的使用方法
2019/09/09 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
2020/06/24 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
Android面试题附答案
2014/12/08 面试题
小学开学寄语
2014/01/19 职场文书
售后服务承诺书
2014/03/26 职场文书
《打电话》教学反思
2016/02/22 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis