https://segmentfault.com/a/11...
我放到了codepen
这篇文章中,对Validator.prototype.add方法中一处地方不理解
为什么要放到自执行函数中。
for(var i = 0, rule; rule = rules[i++];) {
(function(rule) {
var strategyAry = rule.strategy.split(':');
var errorMsg = rule.errorMsg;
self.cache.push(function() {
var strategy = strategyAry.shift();
strategyAry.unshift(dom.value);
strategyAry.push(errorMsg);
return strategies[strategy].apply(dom, strategyAry);
})
})(rule)
}
如果去掉外层的匿名函数就不行。 有什么区别吗?
for(var i = 0, rule; rule = rules[i++];) {
var strategyAry = rule.strategy.split(':');
var errorMsg = rule.errorMsg;
self.cache.push(function() {
var strategy = strategyAry.shift();
strategyAry.unshift(dom.value);
strategyAry.push(errorMsg);
return strategies[strategy].apply(dom, strategyAry);
})
}
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
可能是因为这里可能会有异步操作吧
你把外面那个
for去掉,意思就大不同了,先把for带出来现在这个问题就清楚了,是个循环中的闭包的问题。
如果打开闭包
strategyAry和errorMsg在里面的函数定义中用到,但实际函数调用的时候(这时候肯定已经完成当前函数,也就是说,循环已经结束了),这两个值是根据最后一个rule得到的。结果之前定义的所有cahce都是在处理同一个 rule,当然就会出错了。