【问题标题】:Javascript: Caching within Closure doesn't workJavascript:闭包中的缓存不起作用
【发布时间】:2017-10-20 11:55:12
【问题描述】:

我正在尝试在 APP.findUrlParameter() 中缓存变量“url”的结果。第二次执行该函数时,url不应再未定义,但不幸的是。

示例网址:mypage.com?test=123&name=tom

(function () {
var APP = {

    urlParameterPairs: function () {

        var url;  


        if (window.location.search) {
            url = window.location.search;
            url = url.substring(1).split('&');
            $.each(url, function (i) {
                url[i] = url[i].split('=');
            });
        }
        return url;
    },

    findUrlParameter: function (key) {
        var url; // <---- to be cached !
        console.log(url);

        return (function () {
            var result; 

            url = url || APP.urlParameterPairs();
            $.each(url, function (i) {
                var pair = url[i];
                if (pair[0] === key) {
                    result = pair[1];
                    return false;
                }
            });
            return result;
        }());
    }
};
console.log('name: ' + APP.findUrlParameter('name'));
console.log('test: ' + APP.findUrlParameter('test'));
}());

日志:

  • 未定义
  • 姓名:汤姆
  • 未定义
  • 测试:123

预期:

  • 未定义
  • 姓名:汤姆
  • 数组:["name", "tom"],["test", "123"]
  • 测试:123

【问题讨论】:

  • 每次调用函数findUrlParameter都是在重新赋值变量url,那怎么缓存呢?
  • 在函数内部声明变量会在每次计算函数时创建一个新变量。
  • 谢谢你,你是对的,这对我的尝试没有多大意义。我以错误的方式使用了闭包。我现在可以修复它,请参阅我的答案。

标签: javascript caching closures memoization


【解决方案1】:

感谢您的回答,当然“url”会被重新声明,愚蠢的我没有注意到。我可以通过在它周围包裹一个闭包并返回一个这样的函数来解决它:

findUrlParameter: (function () {
        var url;

        function f(key) {
            var result;

            url = url || APP.urlParameterPairs();
            $.each(url, function (i) {
                var pair = url[i];
                if (pair[0] === key) {
                    result = pair[1];
                    return false;
                }
            });
            return result;
        }
        return f;
    }())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2013-08-31
    • 2012-09-01
    • 2015-05-27
    相关资源
    最近更新 更多