javascript - 为什么 Javascript addEventListener 会更改对象指针的范围?

标签 javascript events

我在使用一段相当简单的普通 Javascript 时遇到了一些麻烦。它所做的就是通过标签名称获取所有 p 元素,并将一个事件处理程序附加到每个元素,该事件处理程序调用一个将颜色更改为红色的函数。

回调函数外el指的是正确的元素,1-6。但在循环内部,它总是引用最后一个,尽管 JavaScript 具有词法变量作用域性质。为什么会这样?可以采取什么措施来实现预期的行为?

fiddle :https://jsfiddle.net/7j4bg68g/

<p>1 This is a test.</p>
<p>2 This is a test.</p>
<p>3 This is a test.</p>
<p>4 This is a test.</p>
<p>5 This is a test.</p>
<p>6 This is a test.</p>

...

function takeAction() {
  this.style.color = 'red';
}

var els = document.getElementsByTagName('p');
for (var i = 0; i < els.length; i++) {
  var el = els[i];

  // logs els 1 to 6 as expected.
  console.log(el.innerHTML);

  el.addEventListener('click', function() {

    // logs "6 This is a test.", and makes the last <p> tag red,
    // regardless of which <p> element you click on.
    console.log(el.innerHTML);
    takeAction.call(el);

  }, false);
}

最佳答案

这是因为闭包,在您的代码中您引用了“el”。所有事件处理程序都引用同一个变量 el ,该变量已更改为循环中给出的最后一个值。 试试这个,

function takeAction() {
  this.style.color = 'red';
}

var els = document.getElementsByTagName('p');
for (var i = 0; i < els.length; i++) {
  var el = els[i];

  // logs els 1 to 6 as expected.
  console.log(el.innerHTML);
(function(elem){
  elem.addEventListener('click', function() {

    // logs "6 This is a test.", and makes the last <p> tag red, regardless of which <p> element you click on.
    console.log(elem.innerHTML); // logs "6 This is a test."
    takeAction.call(elem);

  }, false);
})(el);
}

关于javascript - 为什么 Javascript addEventListener 会更改对象指针的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43212440/

相关文章:

javascript - 向 localStorage 对象添加元素

javascript - 如何调用 HTML DOM 事件对象(例如 : onclick, onblur 等)嵌套函数?

java - 为多个源生成唯一 ID

c - (Linux) 从 PID 为 :VID 的附加 USB 设备获取/dev/input/eventX

html - 如何在DIV中获取按钮而不调用<div>点击事件

javascript - 每次选择数据库列时调用 SQL "function"(存储过程?)

javascript - 无法加载图片

jquery - 为什么 hashchange 在 Jquery Mobile 向后转换中触发两次?

javascript - Mechanize Javascript

php - 将 PHP URL 变量传递给 jquery/ajax 表单