关于call指向和使用findParent递归的疑问

来源:7-3 阿里笔试题

meimei1314

2019-11-17

老师,以下是根据参照老师的代码,写的类

class List {
	constructor(sel) {
	    this.el = Array.from(document.querySelectorAll(sel))
        var self = this
        this.el.forEach(item => {
	        item.addEventListener('click', function (element) {
	            if (element.target.className.indexOf('del') === 0) {
	                self.removeItem(element.target)
                }
             })
        })
    }
    removeItem(target) {
	    var parent = this.el.filter(elem => {
	        return elem === target.parentNode
        })[0]
        if (parent) {
	        parent.removeChild(target)
        }
     }
}
 

老师,关于以上代码,有2个疑问。
第一,关于call的指向问题。
请问调用removeItem方法的使用,老师为何使用 self.removeItem.call(self, element.target)呢?不适用call指向,在removeItem方法里面,直接使用this.el也可以获取到,不是么?
第二,关于递归调用findParent的问题。
只是在ul上添加了click事件,判断点击的是否是.del元素后,在removeItem方法里面判断其父元素后,就可以删除了。觉得没必要一直向上寻找代理元素,有必要使用findParent递归么?

写回答

1回答

快乐动起来呀

2019-11-19

1、之所以用call就是保证 removeItem 中的 this 指向,不然你打印下看看 this 的值有什么变化

2、如果有元素嵌套呢?

0
1
meimei1314
老师,我在constructor和removeItem里面都打印过this了,但是还是找不出有什么区别,麻烦老师,指点一下,谢谢。
2019-11-19
共1条回复

前端跳槽面试必备技巧 面试官全流程指导

一门让你能成功获取前端 Offer 的课程, 不只是技术,面试“技巧”也至关重要

4836 学习 · 830 问题

查看课程