【问题标题】:Why and when should one use window.varName to declare globals? [duplicate]为什么以及何时应该使用 window.varName 来声明全局变量? [复制]
【发布时间】:2017-08-01 14:26:02
【问题描述】:

我刚刚遇到了一个我以前从未见过的约定:

window.theme = window.theme || {};

花了一些时间研究它,我发现这是用var 声明全局变量的替代方法。为什么以及何时我会想要那样做?只是个人喜好吗?

另外:这与问题没有直接关系,但那里的 OR 运算符也让我感到困惑。我理解它的功能:如果它尚不存在,它将window.theme 设置为一个空对象。这只是作为一种安全预防措施,以防它已经在脚本的其他地方实例化了吗?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    在全局级别上查看 window.varName 与 var varName 的答案:https://stackoverflow.com/a/12393346/2592585

    我个人的偏好是避免使用全局变量,因为在企业应用程序中,它们容易发生冲突,其他人会弄乱它们等等。安全性也成为一个问题(你想要一些来自上帝的错误脚本吗?知道在哪里可以访问那个变量?)。它们类似于 Java 类上的公共字段。 “现代” JS 开发使用依赖注入或持久服务来共享数据。

    您所指的特定语法在伪代码中如下所示: 将 window.theme 设置为自身或空对象。该表达式从左到右求值,因此如果定义了window.varName,JS 会将其求值为某种“真”并在那里结束,并将其分配给自身。如果 window.varName 未定义,则该语句的计算结果为 false,并且 OR 将导致将 window.varName 分配给右侧的 {}

    更明确的操作方式是将其编写为三元运算符:window.varName = (window.varName ? window.varName : {});,但为了简单起见,大多数人更喜欢您的 sn-p,并且将三元运算符用于条件比更复杂的单行赋值一个简单的未定义检查。

    您所指的语法是执行JS namespacing 或将属性附加到您要定义的对象时的常见做法。如果它已经存在,那么冷静,继续前进,否则将其设置为空对象,以免出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2011-10-17
      相关资源
      最近更新 更多