这处代码为什么要写成自执行函数

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);
       })
    }
阅读 3k
2 个回答
strategies[strategy].apply(dom, strategyAry);

可能是因为这里可能会有异步操作吧

你把外面那个 for 去掉,意思就大不同了,先把 for 带出来

    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);
        });
    }

strategyAryerrorMsg 在里面的函数定义中用到,但实际函数调用的时候(这时候肯定已经完成当前函数,也就是说,循环已经结束了),这两个值是根据最后一个 rule 得到的。结果之前定义的所有 cahce 都是在处理同一个 rule,当然就会出错了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏