在 Javascript 中使用闭包创建事件处理程序
在 Javascript 编程中,在循环内创建事件处理程序是很常见的。但是,当使用像 select.onchange = function() 这样的语法时,了解共享引用的潜在问题至关重要。
当使用此语法在循环内分配事件处理程序时,它可能会导致指向相同变量的所有事件处理程序,这些变量将包含循环内分配的最终值。这可能会导致将相同的参数传递给所有事件的事件处理程序,而不管各个迭代如何。
要解决此问题并防止共享变量引用,需要使用闭包。闭包涉及创建一个内部函数,该内部函数通过引用从外部函数捕获变量。然后,这个内部函数可以用作事件处理程序,确保每个事件处理程序都有自己的来自相应循环迭代的变量副本。
对于问题中给定的示例,下面的代码演示了如何实现一个闭包并将正确的参数传递给事件处理程序:
<code class="javascript">var blah = xmlres.getElementsByTagName('blah'); for(var i = 0; i < blah.length; i++) { var td = document.createElement('td'); var select = document.createElement('select'); select.setAttribute("...", "..."); select.onchange = function(s,c,a) { return function() { onStatusChanged(s,c,a); } }(select, callid, anotherid); td.appendChild(select); }</code>
在此代码中,内部匿名函数返回用作事件处理程序的函数。函数内的 (s,c,a) 参数通过引用捕获,确保每个事件处理程序都有自己唯一的变量集。这样,当事件发生时,正确的参数将被传递给 onStatusChanged 方法。
以上是在 JavaScript 循环中创建事件处理程序时,闭包如何帮助避免共享引用?的详细内容。更多信息请关注PHP中文网其他相关文章!