我有一个问题。我们都知道Javascript中闭包的强大功能,我想用这个功能。假设我有一个名为“BRB”的对象。我想要的是,每当用户第一次调用方法getBrowser()时,它会发现浏览器版本/名称并将其返回并将其作为静态存储在其自身内部,当getBrowser()第二次调用时它应该返回相同的没有计算的值,因为它已经静态存储在某个地方。这可以通过许多不同的方式完成,我们可以只在对象中存储一个属性,在第一次调用中我们可以为它设置一些值并在以后使用它,我们可以在语法中创建对象时直接运行getBrowser方法< / p>
(function()(
...
))()
但是,这不是我想要的。我想要的只是getBrowser()方法只计算一次值并一直使用它,我不想将值存储在其他地方的对象中,我不想在创建对象时立即运行此方法,我' m只允许使用,只允许使用此方法,所有操作都必须在这一方法中进行。我在这里举了一个例子,因为你看它会一直打印出“0”,但我想要的是它为每个console.log请求打印0,1,2,3。我希望我清楚自己。感谢。
(
function(window){
if(window.BRB) return;
var BRB = function(){}
BRB.prototype.getBrowser = function(){
var browser = null;
return function(){
if(browser === null){
browser = 0;
}
return browser++;
}
}
window.BRB = new BRB();
})(window);
console.log(BRB.getBrowser()());
console.log(BRB.getBrowser()());
console.log(BRB.getBrowser()());
console.log(BRB.getBrowser()());
答案 0 :(得分:1)
您应该在其他地方定义浏览器变量:
(
function(window){
if(window.BRB) return;
var browser = null;
var BRB = function(){}
BRB.prototype.getBrowser = function(){
if(browser === null){
browser = 0;
}
return browser++;
}
window.BRB = new BRB();
})(window);
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
jsfiddle http://jsfiddle.net/5ByYR/1/
如果你能够为getBrowser分配一个对象而不是函数:
(
function(window){
if(window.BRB) return;
var BRB = function(){}
BRB.prototype.getBrowser = {
browser: null,
get: function() {
if(this.browser === null){
this.browser = 0;
}
return this.browser++;
}
}
window.BRB = new BRB();
})(window);
console.log(BRB.getBrowser.get());
console.log(BRB.getBrowser.get());
console.log(BRB.getBrowser.get());
console.log(BRB.getBrowser.get());
答案 1 :(得分:1)
您可能希望getBrowser
方法成为结果的IIFE闭包:
BRB.prototype.getBrowser = (function(){
var browser = null;
return function(){
if(browser === null){
browser = 0;
}
return browser++;
}
})();
这样,browser
变量不会在每次函数调用时重新初始化。
<强>更新强>
您可以使用属性而不是闭包中的变量作为浏览器值:
BRB.prototype.getBrowser = function() {
if(!this.browser){
this.browser = 0;
}
return this.browser++;
}
答案 2 :(得分:1)
您的要求有点奇怪。这是你正在寻找的吗?它的工作原理是在getBrowser函数本身上创建一个属性:
(function(window){
if(window.BRB) return;
var BRB = function(){}
BRB.prototype.getBrowser = function(){
if(typeof this.getBrowser.browser == "undefined"){
return this.getBrowser.browser = 0;
} else {
return ++this.getBrowser.browser;
}
}
window.BRB = new BRB();
})(window);
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());
console.log(BRB.getBrowser());