javascript - 这处代码为什么要写成自执行函数
伊谢尔伦
伊谢尔伦 2017-04-11 12:47:08
[JavaScript讨论组]

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);
       })
    }
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(2)
天蓬老师
strategies[strategy].apply(dom, strategyAry);

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

ringa_lee

你把外面那个 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,当然就会出错了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号