详谈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 相关文章推荐
经典的解除许多网站无法复制文字的绝招
Dec 31 Javascript
JavaScript游戏之是男人就下100层代码打包
Nov 08 Javascript
javascript数组输出的两种方式
Jan 13 Javascript
JS实现网页背景颜色与select框中颜色同时变化的方法
Feb 27 Javascript
js clearInterval()方法的定义和用法
Nov 11 Javascript
Javascript基础回顾之(二) js作用域
Jan 31 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
Apr 28 Javascript
微信小程序授权获取用户详细信息openid的实例详解
Sep 20 Javascript
Vue插件之滑动验证码
Sep 21 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
详解TS数字分隔符和更严格的类属性检查
May 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
一个用php3编写的简单计数器
2006/10/09 PHP
PHP获取文件后缀名的三个函数
2012/10/15 PHP
php生成随机密码自定义函数代码(简单快速)
2014/05/10 PHP
php简单统计在线人数的方法
2016/05/10 PHP
php实现登陆模块功能示例
2016/10/20 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
php实例化一个类的具体方法
2019/09/19 PHP
JQuery里面的几种选择器 查找满足条件的元素$(&quot;#控件ID&quot;)
2011/08/23 Javascript
基于jQuery的计算文本框字数的代码
2012/06/06 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
js图片轮播效果实现代码
2020/04/18 Javascript
jQuery实现Tab选项卡切换效果简单演示
2015/11/23 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
Python求算数平方根和约数的方法汇总
2016/03/09 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
2017/06/30 Python
python实现树形打印目录结构
2018/03/29 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
Python制作运行进度条的实现效果(代码运行不无聊)
2021/02/24 Python
Lucene推荐的分页方式是什么?
2015/12/07 面试题
社区十八大感言
2014/01/19 职场文书
早会主持词
2014/03/17 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
Mysql MVCC机制原理详解
2021/04/20 MySQL
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
linux目录管理方法介绍
2022/06/01 Servers