Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建单例或保持变量引用的JavaScript方法_Javascript - Fatal编程技术网

创建单例或保持变量引用的JavaScript方法

创建单例或保持变量引用的JavaScript方法,javascript,Javascript,有时像这样的技术用于保持变量引用或创建单例。这样,我们将只调用createVariable一次。 这种方法的优缺点是什么 function createVariable() { // usually here may be some long asynchronous task // return true; } function useVariable() { if(!useVariable.someVar) { useVariable.so

有时像这样的技术用于保持变量引用或创建单例。这样,我们将只调用createVariable一次。 这种方法的优缺点是什么

function createVariable() {
    // usually here may be some long asynchronous task
    // 
    return true;
}

function useVariable() {
    if(!useVariable.someVar) {
        useVariable.someVar = createVariable();
    }

    // do something with useVariable.someVar 
}

// we will call useVariable several times. 
// The idea is to call createVariable 
// one time only. 
useVariable();
useVariable();
useVariable();
我感谢所有的想法和建议。我不想创造一个单身汉。只想在函数级别保留变量引用。没有
污染全球范围

以下是如何创建单例(从):

然后像这样使用它

var instance1 = Singleton.getInstance();
var instance2 = Singleton.getInstance();

//You can see here that they are indeed the same instance
alert("Same instance? " + (instance1 === instance2));  

注意:通过Google查找此文件需要5秒钟:

这种方法的优缺点是什么

function createVariable() {
    // usually here may be some long asynchronous task
    // 
    return true;
}

function useVariable() {
    if(!useVariable.someVar) {
        useVariable.someVar = createVariable();
    }

    // do something with useVariable.someVar 
}

// we will call useVariable several times. 
// The idea is to call createVariable 
// one time only. 
useVariable();
useVariable();
useVariable();
这种方法是可以的,尽管我质疑是否需要更高层次的设计问题

实施有两个问题:

  • 如果
    someVar
    包含错误的值,您将在不应该的时候重新创建它。要检查您以前是否创建过它,请使用
    if(!usevaluate.hasOwnProperty(“someVar”){
    而不是
    if(!usevaluate.someVar){

    伪值是
    0
    NaN
    未定义的
    null
    ,当然还有
    false
    (所有其他值都是“真值”)

  • 函数有一些内置属性,既有它们自己的属性(
    name
    length
    ),也有它们从原型中获得的属性(主要是各种方法)。因此,如果变量的名称有
    name
    length
    call
    等,您会错误地认为自己已经创建了它们,因为
    createVariable
    已经具有真实值的属性(在
    createVariable
    案例中)。您可以通过添加某种前缀或使用单独的对象作为映射来解决此问题(尽管对象也继承属性,因此您可能仍然需要前缀),或者如果您使用的是ES2015+,则可以使用
    映射

  • 您说过您只想创建一次变量,并且“不污染全局范围”(这是一件要避免的好事情)。我通过将代码包装到作用域函数中来实现这一点:

    (function() {
        var someVar = createSomeVar();
    
        // My other code here
    })();
    

    这将保持全局命名空间不变,并且只创建
    someVar
    的一个副本,而不需要任何特定的管道。

    这肯定不适用于布尔变量。请检查变量是否未定义:(typeof useVariable.someVar=='undefined')我希望对createVariable的调用会返回一个新的或存储的var,而不是useVariable需要跟踪注意:这需要五秒钟的时间通过Google进行查找:“这就是您创建单例的方式”如何回答“这种方法的优缺点是什么?”我把它添加到了答案中。但你真正想问的是什么?你想问的是单例设计模式的优点和缺点是什么吗?这个问题是经过编辑的。我不想创建单例。只想在函数级别保留变量引用。不污染全局范围。想法是只调用一次createVariable。我想o避免使用范围函数。提问的目的只是收集有关方法的意见。谢谢!@GeorgiNaumov如果您的目的“只是收集意见”,那么您的问题可能因堆栈溢出而偏离主题。请参阅和