在弄百度地图的时候,需要给地图上的每一个标注(Marker)添加监听事件,
开始的想法当然是用for循环,但发现一个问题,无论点击那个标注,显示的内容都是一样的,
实在想不通就百度了一下,果然找到了解决办法,
以下为转载内容:
事件闭包
闭包是Javascript脚本语言的特性之一,不熟悉它的开发者很可能犯下面这种错误:页面有十个标注(Marker实例),我希望点击不同的标注开启内容不同的信息窗口,每个信息窗口显示该标注的索引(1到10)。首先我们初始化标注实例并存放于数组中:
var markers = [];
for (var i =0; i <10; i ++) {
var mkr =new BMap.Marker(new BMap.Point(116.2+ i /20, 39.855), {title: i +1});
markers.push(mkr);
map.addOverlay(mkr);
}
下面,我们添加标注的点击事件,用来开启内容不同的信息窗口:
for (i =0; i <10; i ++) {
markers[i].addEventListener('click', function(){
this.openInfoWindow(new BMap.InfoWindow('我是第'+ (i +1) +'个标注'));
});
}
代码看起来没有任何问题,循环遍历markers数组,为每个标注实例绑定click事件,事件处理函数中开启信息窗口并显示是第几个标注。但是通过浏览器看效果的时候却发现问题了。(图片不显示)明明是第三个标注,点击之后的信息窗口中却显示“11”。实际上,当click的监听函数被执行的时候才会去看变量i的值是什么,此时for循环早已经执行完,那么当for循环执行完i的值正好是11。为了达到我们想要的效果,需要增加一层“闭包”:
for (i =0; i <10; i ++) {
(function(){
var index = i;
markers[i].addEventListener('click', function(){
this.openInfoWindow(new BMap.InfoWindow('我是第'+ (index +1) +'个标注'));
});
})();
}
上面的代码你可以理解为新增加的函数内部保存了每次循环变量i的值,那么当监听函数执行时将会获取闭包内保存的index变量的值,而不是之前的变量i的值。
转载地址
贴上一个关于javascript闭包的连接:javascript深入理解js闭包
分享到:
相关推荐
2. **事件监听器**:忘记移除不再使用的事件监听器也会导致内存泄漏。 3. **定时器**:未正确清理的定时器也会导致内存泄漏。 4. **闭包**:过度使用闭包或不当使用闭包可能会导致不必要的内存占用。 通过上述对...
文件中的例子展示了如何使用闭包解决`setTimeout`中的闭包问题,使得在定时器执行时,闭包能够持有事件监听器中定义的变量值。 此外,闭包还常用于处理循环中的事件监听,比如为一组元素绑定点击事件时,确保每个...
- **使用事件委托**:事件委托是一种通过监听父元素上的事件来替代给每个子元素绑定事件监听器的技术,这样可以减少事件监听器的数量。 - **避免全局变量**:全局变量会增加内存负担,并可能导致命名冲突。使用...
36. **事件监听与移除**:正确添加和移除事件监听器,避免内存泄漏。 37. **对象浅拷贝与深拷贝**:`Object.assign()`进行浅拷贝,使用第三方库如lodash进行深拷贝。 38. **函数柯里化**:将多参数函数转换为接受...
JavaScript的基础语法包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔值、数组、对象等)、条件语句(if...else、switch)、循环(for、while、do...while)以及函数定义和调用。变量是存储数据的...
在JavaScript中,垃圾回收机制通常能自动回收不再使用的内存,但某些情况下,如闭包或事件监听器,可能导致内存泄漏。为了防止内存泄漏,开发者需要确保及时解除对象引用,释放不再需要的资源。 以上是关于...
- **循环**:包括`for`、`while`和`do...while`,用于重复执行代码块。 - **开关语句**:`switch...case`结构允许根据不同的情况执行不同的代码块。 3. **函数** 函数是可重用的代码块,可以通过参数传递数据并...
- **Symbol**:一种新的原始数据类型,用于解决对象键名冲突问题。 - **BigInt**:一种可以表示任意精度整数的数据类型。 5. **数据类型转换** - **表面现象**:如将数字转换为字符串或反之。 - **内部原理**:...
22. **迭代器**:`[Symbol.iterator]` 实现自定义迭代,支持`for...of`循环。 23. **Setters for form elements**:使用 `element.addEventListener('input', e => e.target.value = 'new value')` 直接更新表单...
12. **事件循环(Event Loop)**:理解JavaScript的执行机制,知道宏任务和微任务的区别。 13. **DOM操作**:熟悉`document.querySelector()`和`document.querySelectorAll()`等方法,高效地选择和操作DOM元素。 ...
JavaScript通过事件监听器(`addEventListener`)和事件处理函数来响应这些行为,如点击按钮、滚动页面等。 7. **AJAX和Fetch API** AJAX(异步JavaScript和XML)用于在不刷新整个页面的情况下与服务器交换数据。...
- 控制流:使用条件语句(if...else)、循环(for、while)来实现逻辑判断和迭代。 - 函数:创建和调用函数,了解函数作用域和闭包的概念。 2. **DOM操作**: - `document.querySelector()` 和 `document....
学习如何添加事件监听器(`button.addEventListener('click', function() {...})`)以及处理事件(`event.preventDefault();`)将使你的网页更具交互性。 6. **DOM操作**:文档对象模型(DOM)是HTML和XML文档的...
7. 事件委托:利用事件冒泡,将事件监听器添加到父元素上,处理子元素的事件,减少内存占用和提高性能。 8. 使用`Proxy`和`Reflect`实现自定义行为:它们允许你创建代理对象,拦截并控制对象的访问和操作。 9. ...
`let`, `const`),数据类型(如`string`, `number`, `boolean`, `object`, `null`, `undefined`),条件语句(`if...else`,`switch`),循环(`for`, `while`, `do...while`)和函数定义(`function`)。...