可以隐藏函数属性,以便在函数外部看不到它?

时间:2013-04-22 10:29:16

标签: javascript static-variables

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

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

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

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

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

3 个答案:

答案 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变量。