gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:14:55 25 4
gpt4 key购买 nike

有时像这样的技术用于保持变量引用或创建单例。这样我们将只调用一次 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();

我感谢所有的想法和建议。我不想创建一个单例。只想在函数级别保留变量引用。没有污染全局范围。

最佳答案

What are the pros and cons of this approach?

方法 没问题,尽管我质疑将其作为更高级别的设计问题的必要性。

实现有几个问题:

  1. 如果 someVar 包含一个 falsey 值,您将在不应该的时候重新创建它。要检查您之前是否创建过它,请使用 if(!useVariable.hasOwnProperty("someVar")) { 而不是 if(!useVariable.someVar) {

    假值是0""NaNundefinednull code>,当然还有 false。 (所有其他值都是“真实的”。)

  2. 函数有一些内置属性,包括它们自己的(namelength)和它们从原型(prototype)(主要是各种方法)获得的属性。因此,如果您的变量具有 namelengthcall 等名称,您会错误地认为您在创建它们时还没有,因为 createVariable 已经拥有那些具有真实值的属性(在您的 createVariable 情况下)。您可以通过添加某种前缀或使用单独的对象作为映射来解决此问题(尽管对象也继承属性,因此您仍然可能需要前缀),或者如果您使用的是 ES2015+,则可以使用 map

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

(function() {
var someVar = createSomeVar();

// My other code here
})();

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

关于用于创建单例或保留变量引用的 JavaScript 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34068068/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com