如何为常数变量赋值(不在声明中)?

时间:2019-05-17 16:58:54

标签: javascript

我想拥有一个可以全局保存一个节点的常量,但是我还不知道该节点的值!因此,我必须等到调用特定函数才能获取需要分配给我的全局常量的值。

下面是我当前的代码:

var counter = 0;
let myConstVar; // THIS VARIABLE need to be constant

function FunctionToBeCalled(name){

    //some code

    if(counter==1){
        var myNode = document.getElementById(name);
        myConstVar = myNode.cloneNode(true);
    }

    //some code
}

function Caller(aName){

    //some code

     counter++;
    FunctionToBeCalled(aName);

//some code that will change the behavior of the each node with ID "aName"
}

然后我多次调用函数Caller(每次按一次按钮)。

我上面的代码可以工作,但是每次我输入FunctionToBeCalled myConstVariable的值更改时,它给出的值都不同。

所以我真的需要将变量myConstVar设置为const以保存其值(这是我从调用FunctionToBeCalled获得的第一个节点),以便以后可以使用它并将其分配给另一个变量。

2 个答案:

答案 0 :(得分:3)

我建议不要使用全局变量,但是您可以在全局对象上定义一个吸气剂:

Object.defineProperty(globalThis, "myConstVar", {
  get() { 
    return myNode;
  }
  writable: false, // can't mutate this
  configurable: false
});

从那时起,这将使全局“ myConstVar”具有该值,并且无法更改它。

答案 1 :(得分:1)

实际上,如果某个值会在 时可用,则Promise是保留该值的合适数据结构:

 const node = new Promise((resolve) => {
   if (document.readyState !== 'loading') {
     return resolve(document.getElementById(name).cloneNode(true));
   }
   document.addEventListener("DOMContentLoaded", () => {
     resolve(document.getElementById(name).cloneNode(true));
   });
});

这样,变量可以是常量,不能更改,并且分辨率与声明相关。