我正在编写一个存储画布图案的函数。如果请求画布模式并且它存在,则返回对画布的引用,否则首先创建画布,然后返回引用。
我的第一次尝试是将这些画布引用添加到单独的全局变量中,但后来我将其更改为将其添加到函数中(因为这会保存变量)。
但是,我可以从代码中的任何位置读取属性(无需调用该函数)。这不是一个大问题,但我想知道它是否可以被隐藏(因此,只有一个调用允许通过返回访问该属性)。
alert(myFunction("keyOne")); // "keyOne " + timestamp of now
alert(myFunction("keyTwo"));
alert(myFunction("keyOne")); // same as above, because there it was created
alert(myFunction("keyTwo"));
alert(myFunction.keyOne); // can read it without calling the function, is it possible to hide it?
function myFunction(myKey)
{
if (!(myFunction.hasOwnProperty(myKey))) { myFunction[myKey] = myKey + " " + Date(); }
return myFunction[myKey];
}
编辑:我不知道接受哪个答案。添加变量就是我想要避免的事情。此外,它给代码增加了很多麻烦,使其难以阅读(但它可能是唯一的方法)。如果这是真的,我会这样离开。可读性对我来说非常重要。
答案 0 :(得分:1)
您可以在闭包中捕获键和值的映射,而不是将其设置为函数对象上的静态属性:
var myFunction = (function () {
var keys = {};
return function (myKey) {
if (!keys.hasOwnProperty(myKey)) {
keys[myKey] = myKey + " " + Date();
}
return keys[myKey];
};
}());
立即调用似乎分配给myFunction
的函数表达式,因此其返回值实际上是指定的值。它的返回值恰好是另一个函数,因此myFunction
现在包含对该内部返回函数的引用。
由于返回的函数包含对父作用域中声明的keys
变量的引用,因此一旦包含它的函数返回,该变量就不能被垃圾收集。您已经创建了一个闭包,可以保持对keys
的引用,即使keys
本身不再可以直接访问。
答案 1 :(得分:1)
你可以这样做。
为了闭包的目的,简单地创建一个不间断调用的函数表达式,该闭包将保存对包含myFunction操作数据的对象的引用。
var myFunction;
(function () {
var inner = {};
myFunction = function (myKey) {
if (!(inner.hasOwnProperty(myKey))) { inner[myKey] = myKey + " " + Date(); }
return inner[myKey];
}
}());
答案 2 :(得分:1)
您可以将其隐藏在匿名函数中:
(function(ns) {
var store = {};
ns.myFunction = function(myKey) {
if (!store.hasOwnProperty(myKey)) {
store[myKey] = myKey + ' ' + Date();
}
return store[myKey];
}
}(this));
我隐式地在包装函数中传递window
作为应该定义函数的“命名空间”。无法从外部联系store
变量。