Javascript 为什么立即调用的函数表达式会干扰onclick?

Javascript 为什么立即调用的函数表达式会干扰onclick?,javascript,scope,onclick,dom-events,iife,Javascript,Scope,Onclick,Dom Events,Iife,函数声明在当前范围内创建变量(具有该函数的值) onclick属性只能访问自己的范围和全局范围 IIFE中的函数超出范围 快速而肮脏的解决方案是使changeText成为一个全局变量 清洁溶液,OTOH: 这是您应该避免使用onclick属性的另一个原因 不要通过将字符串粉碎在一起来生成HTML。直接生成DOM并使用addEventListener Uncaught ReferenceError: changeText is not defined at HTMLElement.on

函数声明在当前范围内创建变量(具有该函数的值)

onclick
属性只能访问自己的范围和全局范围

IIFE中的函数超出范围


快速而肮脏的解决方案是使
changeText
成为一个全局变量


清洁溶液,OTOH:

这是您应该避免使用onclick属性的另一个原因

不要通过将字符串粉碎在一起来生成HTML。直接生成DOM并使用
addEventListener

Uncaught ReferenceError: changeText is not defined
    at HTMLElement.onclick 
for(变量x=0;x


注意:段落不是为交互控件而设计的。向段落中添加单击事件会使不使用(或不能使用)定点设备的用户无法访问它们。您应该使用为单击而设计的控件(如
)相反。

从父属性调用它会更好。给你的HTML地址
p
“干净的解决方案”:我不同意。你不应该在循环中创建那个点击处理程序。@Cerbrus你能解释一下为什么在循环中创建那个点击处理程序是错误的吗?这是一个美观的问题吗?还是这样做会影响你的代码?@user19380947:如果你有50个问题,你正在创建50个该函数的副本。只要在循环外部创建该函数一次,并将其传递给
addEventListener
@Cerbrus如果将其置于循环外部,则只会为最后一段创建一个事件侦听器。无论如何,要修复该问题,并为每个段落创建一个侦听器,允许您更改该函数,而不会像在上面的e代码?此:
function(){changeText(This.dataset.x);}
必须移出循环。而不是整个
addEventListener
调用。
Uncaught ReferenceError: changeText is not defined
    at HTMLElement.onclick 
for(var x = 0; x < questions.length; x+= 1) {
    var p = document.createElement("p");
    p.appendChild(document.createTextNode("question[i]");
    p.setAttribute("data-x", x);
    p.addEventListener("click", function() { changeText(this.dataset.x); });  
    something.appendChild(p);
 }