Javascript:闭包中的缓存不起作用
Javascript: Caching within Closure doesn't work
我试图在 APP.findUrlParameter() 中缓存变量 "url" 的结果。第二次执行该函数时,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
感谢您的回答,当然 "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;
}())
我试图在 APP.findUrlParameter() 中缓存变量 "url" 的结果。第二次执行该函数时,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
感谢您的回答,当然 "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;
}())