mutable variable accessible from closure

在写解析表达式的时候由于循环遍历从表达式截取下来的字符串数组,再加上要在商品列表中做相应的筛选。就是从一个商品列表中筛选出符合条件的商品进入到下一次筛选,于是我想到了用underscore里边的filter方法来减少代码,如下:

 1 for (var j = 0; j < temp.length; j++) {
 2     if (temp[j].indexOf("==") != -1) {
 3         temp[j] = temp[j].replace(/[']/g, "");
 4         var the_key = temp[j].split("==")[0];
 5         var the_value = temp[j].split("==")[1];
 6         _.filter(item_list, function (item) {
 7             return has_the_property(item.properties, the_key, the_value)
 8         })
 9 
10     } else if (temp[j].indexOf("<") != -1) {
11     } else if (temp[j].indexOf(">") != -1) {
12     }
13 }

就是这种在一个for循环中嵌套一层带有回调函数的方法,这个时候以上蓝色加粗的变量 the_key,the value就会被提示mutable variable accessible from closure,大概是在这个关闭中有会发生改变的变量。因为有一个回调函数,而回调函数并不会顺序的被执行,也就是可能回调函数还没执行for循环已经到了下一次循环,或者下几次循环。这样不确定的行为显然在程序中是不科学的,所以这么写就会报错。

 

解决办法:

1、那就是不要这样写,在循环中不要使用这种带有回调函数的方法。

2、写成如下这种形式

1 for(var j=0; j<temp.length; j++) {     
2    (function(){           
3       ...      
4    })(j) 
5 }

 

好吧就这样了,这两种办法可以应付这种状况了。。。

 

 
 
posted @ 2016-11-25 18:33  Mr.Revive  阅读(1635)  评论(0编辑  收藏  举报