题主没给出 checkutil
和 checkdata
的类型,我只能以我自己的推倒来模拟:
class Checker {
isNumber(data) {
return !isNaN(data);
}
}
var checker = new Checker();
var checkdata = "15";
var checkutil = "checker";
var result = eval(checkutil + '.isNumber("' + checkdata + '")');
console.log(result); // 输出 true
这时候 eval
里边的字符串是:checker.isNumber("15")
,是没有任何语法错误的。
我们把 checkdata 改成非单纯的数字字符串:
var checkdata = "15abc";
// ....
console.log(result); // 输出 false
这时候 eval
里边的字符串是:checker.isNumber("15abc")
,也是没有任何语法错误的。
但是,如果我们将 eval 中的双引去掉:
// ...
var result = eval(checkutil + '.isNumber(' + checkdata + ')');
产生异常:
undefined:1
checker.isNumber(15abc)
^^
SyntaxError: missing ) after argument list
checker.isNumber(15abc)
中 isNumber
方法的参数 15abc
究竟是个什么类型呢?既不是有效的字面量也不是定义过的对象。所以你知道为什么会出现语法错误了吧。
双引是为了确保 isNumber
的参数为一个有效的对象,而双引表示的字符串一定是有效的对象。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…