1

我正在编写一个函数来存储画布模式。如果请求画布模式并且它存在,则返回对画布的引用,否则首先创建画布,然后返回引用。

我的第一次尝试是将这些画布引用添加到一个单独的全局变量,但后来我将其更改为将它们添加到函数中(因为这会保存一个变量)。

但是,我可以从代码中的任何位置读取该属性(无需调用该函数)。这并不是一个真正的大问题,但我想知道它是否可以隐藏(因此,只有调用允许通过返回访问该属性)。

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];
}

编辑:我不知道接受哪个答案。添加变量正是我试图避免的事情。此外,它还给代码增加了很多麻烦,使其难以阅读(但这可能是唯一的方法)。如果这是真的,我就这样离开它。可读性对我来说非常重要。

4

3 回答 3

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本身不再可以直接访问。

于 2013-04-22T10:32:07.200 回答
1

你可以这样做。

只需创建一个立即调用的函数表达式,以实现闭包的目的,该闭包将包含对包含 myFunction 操作的数据的对象的引用。

var myFunction;
(function () {
    var inner = {};

    myFunction = function (myKey) {
        if (!(inner.hasOwnProperty(myKey))) { inner[myKey] = myKey + " " + Date(); }
        return inner[myKey];
    }
}());
于 2013-04-22T10:32:10.747 回答
1

您可以将其隐藏在匿名函数中:

(function(ns) {

    var store = {};

    ns.myFunction = function(myKey) {
        if (!store.hasOwnProperty(myKey)) {
            store[myKey] = myKey + ' ' + Date();
        }
        return store[myKey];
    }
}(this));

我隐含地window将包装函数作为应该在其下定义函数的“命名空间”传递。store无法从外部访问该变量。

于 2013-04-22T10:34:36.837 回答