mutable variable accessible from closure

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

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

 

 
 

以上是关于mutable variable accessible from closure的主要内容,如果未能解决你的问题,请参考以下文章

Scala:mutable.Map[Any,Any] 不能应用于 mutable.Map[String,Int]

mutable关键字

Rust学习-阶段1学习总结

用mutable.Map和mutable.et折叠使用Set.add时不起作用

C++ 中的 volatile 与 mutable

深入理解C++中的mutable关键字