面试题答案
一键面试-
innerClickHandler
函数中的this
指向: 在上述代码中,innerClickHandler
函数中的this
指向window
(在严格模式下指向undefined
)。这是因为addEventListener
添加的事件处理函数中的this
,默认绑定到触发事件的元素(如果没有在调用addEventListener
时通过addEventListener(type, listener, options)
的options
参数中的capture
或useCapture
等设置改变this
指向的话),而这里在全局环境下调用,this
指向全局对象window
。 -
修改代码使得点击按钮时能够正确输出
obj
的data
属性值的方法:- 使用箭头函数:
const obj = { data: '初始数据', setupEvent: function () { const btn = document.getElementById('btn'); const that = this; btn.addEventListener('click', () => { console.log(that.data); }); } };
这里利用箭头函数没有自己的
this
,它的this
继承自外层作用域的特性,外层setupEvent
函数中的this
指向obj
,所以箭头函数中的this
也指向obj
,从而可以正确输出obj
的data
属性值。- 使用
bind
方法:
const obj = { data: '初始数据', setupEvent: function () { const btn = document.getElementById('btn'); function innerClickHandler() { console.log(this.data); } btn.addEventListener('click', innerClickHandler.bind(this)); } };
通过
bind
方法将innerClickHandler
函数的this
绑定到setupEvent
函数中的this
(即obj
),这样在点击按钮时,innerClickHandler
函数中的this
就会指向obj
,可以正确输出obj
的data
属性值。