34818060 2016-12-09 03:27 采纳率: 0%
浏览 1256
已采纳

JavaScript 参数this问题

<script type="text/javascript">
var get = {
    byId: function(id) {
        return document.getElementById(id)
    },
    byClass: function(sClass, oParent) {
        var aClass = [];
        var reClass = new RegExp("(^| )" + sClass + "( |$)");
        var aElem = this.byTagName("*", oParent);
        for (var i = 0; i < aElem.length; i++) reClass.test(aElem[i].className) && aClass.push(aElem[i]);
        return aClass
    },
    byTagName: function(elem, obj) {
        return (obj || document).getElementsByTagName(elem)
    }
};
window.onload = function ()
{
    var oNav = get.byId("nav");
    var aLi = get.byTagName("li", oNav);
    var aSubNav = get.byClass("subnav", oNav);
    var oSubNav = oEm = timer = null;
    var i = 0;

    for (i = 1; i < aLi.length; i++)
    {
        aLi[i].onmouseover = function ()
        {
            //隐藏所有子菜单
            for (i = 0; i < aSubNav.length; i++)aSubNav[i].style.display = "none";

            //获取该项下的子菜单
            oSubNav = get.byClass("subnav", this)[0];

            //获取该项下的指示箭头
            oEm = get.byTagName("em", this)[0];

            //显示该项下的子菜单
            oSubNav.style.display = "block";

            //判断显示区域
            oNav.offsetWidth - this.offsetLeft > oSubNav.offsetWidth ? 

            //如果在显示范围居左显示
            oSubNav.style.left = this.offsetLeft + "px" :

            //超出显示范围居右显示
            oSubNav.style.right = 0;

            //计算指标箭头显示位置
            oEm.style.left = this.offsetLeft - oSubNav.offsetLeft + 50 + "px";
            clearTimeout(timer);

            //阻止事件冒泡
            oSubNav.onmouseover = function (event)
            {
                (event || window.event).cancelBubble = true;
                clearTimeout(timer)
            }
        };

        aLi[i].onmouseout = function ()
        {
            timer = setTimeout(function () {
                oSubNav.style.display = "none"
            },300)  
        }
    }
};
</script>




 **_var aElem = this.byTagName("*", oParent);
 这句的意思是获取oParent下的所有标签
 但这句中的this指向的对象是什么?,我感觉this没什么作用**_
  • 写回答

3条回答 默认 最新

  • 非二 2016-12-11 13:45
    关注

    this总指向是调用函数的对象。_
    byTagName这个函数的定义在get对象的下面,调用的时候需要用get.byTagName来调用。而byClass也是定义在get下面的函数,调用的时候必须通过get.byClass 来调用。
    在byClass中又调用了get.byTagName函数,调用byClass和调用byTagName的对象相同都是get对象,所以文中利用了this关键字替换掉了getget.byTagName的get对象。
    我觉得涉及到了函数的优化,因为如果在get.byClass中直接写get.byTagName,js还有去寻找get这个对象,而直接有this关键字就简化了这一过程。
    不知道是不是这样,请大咖们指出错误,让我们一起学习js这门语言。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配