详谈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控制表单操作的常用代码小结
Aug 15 Javascript
javascript得到当前页的来路即前一页地址的方法
Feb 18 Javascript
初步认识JavaScript函数库jQuery
Jun 18 Javascript
javascript的变量、传值、传址、参数之间关系
Jul 26 Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
Apr 17 Javascript
Javascript 调用 ActionScript 的简单方法
Sep 22 Javascript
JavaScript运动框架 多物体任意值运动(三)
May 17 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
Mar 28 jQuery
JS计算两个数组的交集、差集、并集、补集(多种实现方式)
May 21 Javascript
微信小程序使用车牌号输入法的示例代码
Aug 20 Javascript
Vue用mixin合并重复代码的实现
Nov 27 Vue.js
vue中控制mock在开发环境使用,在生产环境禁用方式
Apr 06 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
PHPlet在Windows下的安装
2006/10/09 PHP
ajax php 实现写入数据库
2009/09/02 PHP
php中++i 与 i++ 的区别
2012/08/08 PHP
PHP+JavaScript实现无刷新上传图片
2017/02/21 PHP
PHP设计模式之工厂模式实例总结
2017/09/01 PHP
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
jQuery实现简洁的导航菜单效果
2015/11/23 Javascript
Javascript BOM学习小结(六)
2015/11/26 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
javascript函数命名的三种方式及区别介绍
2016/03/22 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
Python 类与元类的深度挖掘 I【经验】
2016/05/06 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
python rsync服务器之间文件夹同步脚本
2019/08/29 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
花园仓库建筑:Garden Buildings Direct
2018/02/16 全球购物
weblogic面试题
2016/03/07 面试题
Java基础面试题
2012/11/02 面试题
医药专业推荐信
2013/11/15 职场文书
公司活动策划方案
2014/01/13 职场文书
进口业务员岗位职责
2014/04/06 职场文书
标准大学生职业生涯规划书写作指南
2014/09/18 职场文书
小学班主任心得体会
2016/01/07 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
logback如何自定义日志存储
2021/08/30 Java/Android
常用的文件对应的MIME类型汇总
2022/04/26 HTML / CSS