JavaScript eval()语法

时间:2017-07-19 22:57:02

标签: javascript string eval string-matching

我有一个旧脚本,用于通过向body标签添加类名来更改网站的字体大小,其部分功能是在将现有类更改为其他设置之前删除现有类。问题是eval行删除了任何单词" large," "介质,"或"小"来自body标签上的其他类,它们充当页面的唯一标识符,这会干扰我正在使用的其他脚本。如何更改以下代码中的eval行,使其仅匹配整个单词?



/* Override CSS with global font size selected by user */
function changeFontSize(size) {
var oldClasses, currentClass;

/*sets key words to be eliminated*/
oldClasses = eval("/large|medium|small/ig");

/*gets the current class names*/
currentClass = document.body.className;

/*eliminates key words from string, then adds new size*/
document.body.className = currentClass.replace(oldClasses, "") + " " + size;
}




1 个答案:

答案 0 :(得分:3)

没有充分的理由在这里使用eval(...)操作。像这里提到的许多人一样,eval是不好的做法。

在这里阅读更多相关信息: what does eval do and why its evil?

执行eval("/large|medium|small/ig")var pattern = /large|medium|small/ig/相同。前者将评估string以确定该表达式在将其作为正则表达式文字导出之前的含义。虽然后者是一个直接的声明,但实际上它更有效率,因为你正在跳过评估步骤。

由于字体模式是静态的(不会更改),因此最好将其声明为正则表达式对象并继续使用它。

示例:

var FONT_SIZE_NAMES_PATTERN = new RegExp(/\b(large|medium|small)\b/ig);

function changeFontSize(size) {
    var oldClasses, currentClass;

    /*gets the current class names*/
    currentClass = "large";

    /*eliminates key words from string, then adds new size*/
    // document.body.className = currentClass.replace(FONT_SIZE_NAMES_PATTERN, "") + " " + size;
    console.log("New class name = " + currentClass.replace(FONT_SIZE_NAMES_PATTERN, "") + " " + size);
}

changeFontSize("VERY LARGE");