DoubleSRZee 2017-11-21 12:23 采纳率: 100%
浏览 2044
已采纳

JavaScript中push()和push.call()的使用

最近在写一个简单的jq的id元素获取的实现,在使用push遇到了点小麻烦。感觉push和push.call实现都可以,但是push无法实现。

代码大致意思是:通过封装了的循环函数去获取id元素,在循环函数中实现改变元素样式。封装时,为了函数中能够使用数组中的数据,使用函数的call方法借用了上下文,然后执行获取元素的函数,是用正则匹配id选择器字符,将获取到的dom节点追加到数组results中。问题出在了这里!追加的过程使用push直接追加不能实现,使用push.call()可以实现。以下是代码截图。

使用push时,打开控制台会显示错误this.style is undefined,div颜色无效。

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        div {
            width: 100px;
            height: 30px;
            border: 1px solid red;
            margin: 10px 0;
        }
    </style>
</head>
<body>
<div id="dv"></div>
</body>
<script>
    var getId = function(id,results){
        results = results || [];
        var rquickExpr = /^(?:#([\w-]+))$/,
                m = rquickExpr.exec(id);
        if(m){
           if(m[1]){
               results.push.call(results,document.getElementById(m[1]));
//               results.push(results,document.getElementById(m[1]));  
               return results;
           }
        }
    };
    var each = function(arr,fn){
        for(var i = 0 ; i < arr.length;i++){
            if(fn.call(arr[i]) === false){//借用上下文,fn的this指向数组中的元素
                break;
            }
        }
    };
    each(getId('#dv'),function(){
        this.style.backgroundColor = 'pink';
    });
</script>
</html>
  • 写回答

1条回答 默认 最新

  • danielinbiti 2017-11-21 12:33
    关注
     没有push.call(),这是call函数的使用,不是push具有的
     具体可以看js的call函数
     results.push.call(results,document.getElementById(m[1]));
     =》
     results.push(document.getElementById(m[1]));
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制
  • ¥20 usb设备兼容性问题
  • ¥15 错误(10048): “调用exui内部功能”库命令的参数“参数4”不能接受空数据。怎么解决啊
  • ¥15 安装svn网络有问题怎么办