使用WebStorm开发百度地图API时,在WebStorm中变量new_info提示:mutable variable accessible from closure…,译:可从闭包中访问的可变变量。在实际运行中,函数_translateCallback2()的形参info接收到元素的个数总是小于变量new_info传入元素个数,原因是在translate()函数的回调没有执行完,for就进行了下一个循环,或者是下几个循环。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
_translateCallback2 = function (data, info){ console.log('info:', info); ///// // ... } var convertor = new BMap.Convertor(); for(var v1=0,v2=10,i=0; i<new_point.length/10; i++){ v2 = v2 < new_point.length ? v2 : new_point.length; var v_point = new_point.slice(v1, v2); var new_info = info.slice(v1, v2); console.log('new_info:', new_info); ///// convertor.translate(v_point, 1, 5, function (data) { _translateCallback2(data, new_info); }); v1 += 10; v2 += 10; } |
解决方法:
1、在使用for循环时,不要使用带有回调函数的方法;
2、如果一定要使用带有回调函数的方法,那就用立即执行匿名函数括起来,如下:
(function(){ …… })(i);
0 1 2 3 4 5 6 7 8 9 10 11 12 13 |
var convertor = new BMap.Convertor(); for(var v1=0,v2=10,i=0; i<new_point.length/10; i++){ (function () { // 看这里 v2 = v2 < new_point.length ? v2 : new_point.length; var v_point = new_point.slice(v1, v2); var new_info = info.slice(v1, v2); convertor.translate(v_point, 1, 5, function (data) { _translateCallback2(data, info.slice(v1, v2)); }); v1 += 10; v2 += 10; })(i); //看这里 } |