javascript 我尝试用动态生成的名称声明常量

oiopk7p5  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(79)

所以,我想把我的一些编码过程自动化。我想也许我不必手动命名所有引用类的常量,而是让一个函数来做。这是我的代码,我觉得它应该工作。当然它不工作。应该吗?如果不,为什么不呢?

function definitions() {
    var allElem = document.querySelectorAll("*"); //Get every HTML element.
    
    for(a = 0; a < allElem.length; a++) { //Iterate through every HTML element.
        
        if (allElem[a].classList.length == 0) { //If an element has no class...
            
            console.log("no var declared, " + a); //...ignore it.       
        
        } else { //If it has one or more classes...
            
            for(b = 0; b < allElem[a].classList.length; b++) { //...iterate through the classList.
                eval("const " + allElem[a].classList[b] + " = " + "document.getElementsByClassName('" + allElem[a].classList[b] + "');"); //Declare a constant named for the class if refers to
                console.log("const " + allElem[a].classList[b] + " = " + "document.getElementsByClassName('" + allElem[a].classList[b] + "');");                
            }
        }
    }
    console.log(document.getElementsByClassName('clone').length); //This logs 10, which is correct.
    console.log(clone.length); // 'Uncaught ReferenceError: clone is not defined'. But... but... I thought I did... :'(
}
shyt4zoc

shyt4zoc1#

您的代码存在一些问题
您使用eval动态创建常量,该常量具有您正在迭代的类名,这会降低速度,并可被攻击者利用来执行任意代码。
您可以使用更直接的方法,

像这样

const constants = {};

for(a = 0; a < allElem.length; a++) {
  if (allElem[a].classList.length == 0) {
    console.log("no var declared, " + a);
  } else {
    for(b = 0; b < allElem[a].classList.length; b++) {
      constants[allElem[a].classList[b]] = document.getElementsByClassName(allElem[a].classList[b]);
      console.log("constants." + allElem[a].classList[b] + " = " + "document.getElementsByClassName('" + allElem[a].classList[b] + "');");
    }
  }
}

console.log(constants.clone.length);

相关问题