详谈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 相关文章推荐
不安全的常用的js写法
Sep 15 Javascript
JavaScript中实现异步编程模式的4种方法
Sep 24 Javascript
原生javascript实现图片按钮切换
Jan 12 Javascript
jQuery插件MixItUp实现动画过滤和排序
Apr 12 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
Sep 15 Javascript
分享网页检测摇一摇实例代码
Jan 14 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
Jan 22 Javascript
vue实现验证码输入框组件
Dec 14 Javascript
VSCode中如何利用d.ts文件进行js智能提示
Apr 13 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 Javascript
Vue中props的详解
May 16 Javascript
使用webpack搭建pixi.js开发环境
Feb 12 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
PHP开发中常用的8个小技巧
2008/08/27 PHP
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
全面解析JavaScript中的valueOf与toString方法(推荐)
2016/06/14 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
配置nodejs环境的方法
2017/05/13 NodeJs
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
Vue自定义指令写法与个人理解
2019/02/09 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
详解关于Vue单元测试的几个坑
2020/04/26 Javascript
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
对python中的高效迭代器函数详解
2018/10/18 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
python和mysql交互操作实例详解【基于pymysql库】
2019/06/04 Python
python判断无向图环是否存在的示例
2019/11/22 Python
python 实现汉诺塔游戏
2020/11/28 Python
英国家用电器购物网站:Hughes
2018/02/23 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
材料物理专业大学毕业生求职信
2013/10/15 职场文书
毕业研究生的自我鉴定
2013/11/30 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
违章停车检讨书
2014/10/21 职场文书
导游词400字
2015/02/13 职场文书
史上最牛的辞职信
2015/02/28 职场文书
2016年大学迎新晚会工作总结
2015/10/15 职场文书
python如何获取网络数据
2021/04/11 Python
Html5新增了哪些功能
2021/04/16 HTML / CSS
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers