详谈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 相关文章推荐
TopList标签和JavaScript结合两例
Aug 12 Javascript
js 优化次数过多的循环 考虑到性能问题
Mar 05 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
Nov 21 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
Feb 26 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
jquery实现右键菜单插件
Mar 29 Javascript
jquery原理以及学习技巧介绍
Nov 11 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
基于JavaScript实现的插入排序算法分析
Apr 14 Javascript
javascript基本常用排序算法解析
Sep 27 Javascript
Vue.js 表单控件操作小结
Mar 29 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
Aug 21 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使用Session遇到的一个Permission denied Notice解决办法
2014/07/30 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
再谈javascript面向对象编程
2012/03/18 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
js实现兼容IE和FF的上下层的移动
2015/05/04 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
Angularjs手动解析表达式($parse)
2016/10/12 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
canvas实现钟表效果
2017/02/13 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
js实现简单选项卡功能
2020/03/23 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
python xml解析实例详解
2016/11/14 Python
Python判断两个对象相等的原理
2017/12/12 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
python 解决函数返回return的问题
2020/12/05 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
计算机网络毕业生自荐信
2013/10/01 职场文书
平面设计师岗位职责
2014/09/18 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
师范生教育见习总结
2015/06/23 职场文书
初中英语教学反思范文
2016/02/15 职场文书
PHP解决高并发问题
2021/04/01 PHP
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android