Revisão
A abordagem discreta do JavaScript foi boa no PAST - especialmente a vinculação do manipulador de eventos no HTML foi considerada uma má prática (principalmente porque o onclick events run in the global scope and may cause unexpected error
que foi mencionado pelo YiddishNinja )
Contudo...
Atualmente, parece que essa abordagem está um pouco desatualizada e precisa de alguma atualização. Se alguém quiser ser desenvolvedor profissional de front-end e escrever aplicativos grandes e complicados, precisará usar estruturas como Angular, Vue.js, etc ... No entanto, essas estruturas geralmente usam (ou permitem usar) modelos HTML em que manipuladores de eventos são vinculados no código html-template diretamente e isso é muito útil, claro e eficaz - por exemplo, no modelo angular geralmente as pessoas escrevem:
<button (click)="someAction()">Click Me</button>
Em js / html bruto, o equivalente a isso será
<button onclick="someAction()">Click Me</button>
A diferença é que, no onclick
evento js bruto , é executado no escopo global - mas as estruturas fornecem encapsulamento.
Então onde está o problema?
O problema é quando o programador iniciante que sempre ouviu falar que o html-onclick é ruim e que sempre usa btn.addEventListener("onclick", ... )
quer usar alguma estrutura com modelos ( addEventListener
também tem desvantagens - se atualizarmos o DOM de maneira dinâmica usando innerHTML=
(o que é bastante rápido )), perderemos eventos manipuladores se ligam dessa maneira). Então, ele enfrentará algo como maus hábitos ou abordagem incorreta do uso da estrutura - e ele usará a estrutura de maneira muito ruim - porque ele se concentrará principalmente na parte js e não na parte do modelo (e produzirá incertos e difíceis de manter código). Para mudar esses hábitos, ele perderá muito tempo (e provavelmente precisará de um pouco de sorte e professor).
Então, na minha opinião, com base na experiência com meus alunos, seria melhor para eles se eles usassem html-handlers-bind no início. Como eu digo, é verdade que os manipuladores são chamados no escopo global, mas nesse estágio os alunos geralmente criam aplicativos pequenos e fáceis de controlar. Para escrever aplicativos maiores, eles escolhem algumas estruturas.
Então o que fazer?
Podemos ATUALIZAR a abordagem JavaScript Discreta e permitir manipuladores de eventos de ligação (eventualmente com parâmetros simples) em html (mas apenas manipulador de ligação - não colocar lógica no onclick como no quesiton OP). Portanto, na minha opinião, em js / html bruto, isso deve ser permitido
<button onclick="someAction(3)">Click Me</button>
ou
function popup(num,str,event) {
let re=new RegExp(str);
// ...
event.preventDefault();
console.log("link was clicked");
}
<a href="https://example.com" onclick="popup(300,'map',event)">link</a>
Mas exemplos abaixo NÃO devem ser permitidos
<button onclick="console.log('xx'); someAction(); return true">Click Me</button>
<a href="#" onclick="popup('/map/', 300, 300, 'map'); return false;">link</a>
A realidade muda, nosso ponto de vista também deve