简体   繁体   English

这个keywork在JS中的奇怪行为

[英]strange behavior of this keywork in JS

I have some code, which is really simple, but if I use this keyword, it won't work.我有一些代码,很简单,但是如果我使用这个关键字,它就不起作用了。 I already searched internet, but this keyword is still a mystery.我已经搜索过互联网,但这个关键字仍然是一个谜。

Anyone can explain to me why?任何人都可以向我解释为什么?

let backdrop = document.querySelector('.backdrop');
let modal = document.querySelector('.modal')
let selectPlanButtons = document.querySelectorAll('.plan button');
let modalBoBtn = document.querySelector('.modal__action--negative');
let toggleBtn = document.querySelector('.toggle-button');
let mobileNav = document.querySelector('.mobile-nav');

for(let i=0; i<selectPlanButtons.length; i++){
    selectPlanButtons[i].addEventListener('click', showModal);    
}

backdrop.addEventListener('click', closeBackdrop);
modalBoBtn.addEventListener('click', closeModal);
toggleBtn.addEventListener('click', closeShowToggleBtn);

function closeBackdrop(){
    mobileNav.style.display = 'none';
    closeModal(); // if change to this.closeModal(); => won't work
}

function closeShowToggleBtn(){
    mobileNav.style.display = 'block';
    backdrop.style.display = 'block';
}

function showModal(){
    modal.style.display = 'block';
    backdrop.style.display = 'block';
};

function closeModal(){
    modal.style.display = 'none';
    backdrop.style.display = 'none';
};

The catch here is that in JavaScript for a regular function this refers to its execution context.这里要注意的是,在 JavaScript 中,对于常规的functionthis是指其执行上下文。 When you register backdrop.addEventListener('click', closeBackdrop);当你注册backdrop.addEventListener('click', closeBackdrop); closeBackdrop() will be called in the context of an HTML element, I'm guessing HTMLButtonElement in this case. closeBackdrop()将在 HTML 元素的上下文中调用,在这种情况下我猜是HTMLButtonElement Because of that, inside closeBackdrop() this refers to the HTML element that handles the click event.因此,在closeBackdrop()内部, this指的是处理click事件的 HTML 元素。 showModal() is defined in the global context and so it is undefined on this HTML element where closeBackdrop() is being called. showModal()在全局上下文中定义,因此在closeBackdrop()的 HTML 元素上undefined Here you can find a more complete explanation on how this works. 在这里,您可以找到有关其工作原理的更完整说明。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM