创建单例或保持变量引用的JavaScript方法
有时像这样的技术用于保持变量引用或创建单例。这样,我们将只调用createVariable一次。 这种方法的优缺点是什么创建单例或保持变量引用的JavaScript方法,javascript,Javascript,有时像这样的技术用于保持变量引用或创建单例。这样,我们将只调用createVariable一次。 这种方法的优缺点是什么 function createVariable() { // usually here may be some long asynchronous task // return true; } function useVariable() { if(!useVariable.someVar) { useVariable.so
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如果您的目的“只是收集意见”,那么您的问题可能因堆栈溢出而偏离主题。请参阅和