向函数传递参数时保留变量值
使用 JavaScript 循环时,您可能会遇到需要保留以下值的情况将变量传递给函数时。当变量的值在循环执行期间可能发生变化时,就会出现这种情况,从而导致事件侦听器出现意外行为。
请考虑以下示例:
<code class="js">for (var i = 0; i < results.length; i++) { marker = results[i]; google.maps.event.addListener(marker, 'click', function() { change_selection(i); }); }
在此代码中,事件侦听器是附加到循环内的每个标记。但是,当触发侦听器时,它使用 i 的最终值,即循环结束时结果数组的长度。这种行为是不可取的,因为它会导致所有事件侦听器使用相同的值。
要为每个侦听器保留 i 的值,您可以使用块范围变量(在现代浏览器中)或闭包(在
现代浏览器 (ES6):
<code class="js">for (let i = 0; i < results.length; i++) { let marker = results[i]; google.maps.event.addListener(marker, 'click', () => change_selection(i)); }</code>
使用 let 关键字创建一个只能在循环内访问的块范围变量。这确保每个事件监听器在创建时都有自己的 i 值副本。
旧版浏览器:
<code class="js">for (var i = 0; i < results.length; i++) { (function (i) { marker = results[i]; google.maps.event.addListener(marker, 'click', function() { change_selection(i); }); })(i); }</code>
创建匿名函数并调用它以 i 作为第一个参数创建一个闭包。该函数保留创建时 i 的值,确保每个事件侦听器为其特定标记使用正确的值。
以上是将参数传递给循环内的函数时如何保留变量值?的详细内容。更多信息请关注PHP中文网其他相关文章!