背景故事:
这适用于所有浏览器,除了Safari(5.0.1)
var chunk = arr[i];
chunk = chunk.replace('$', '\\$');
var a = eval('message.match(/' + chunk + '/gi);');
if(a instanceof Array) symbol = symbol.concat(a);
所以我将其修改为以下内容:
var chunk = String(arr[i]);
chunk = chunk.replace('$', '\\$');
var a = eval('message.match(/' + chunk + '/gi);');
if(a instanceof Array) symbol = symbol.concat(a);
这让Safari更加高兴,因为它只是在抛出一个模棱两可的错误(有趣!)
我找到了解决方案,我将在下面发布,以防任何其他脚本编写者遇到此问题。
答案 0 :(得分:2)
我无法重现这个问题,因为我不确定chunk
的价值是什么。
无论如何,这是不必要使用eval
的另一个例子,您可以使用RegExp
构造函数从字符串构建RegExp
对象,例如:
var re = /foo/gi;
等同于使用RegExp
构造函数在运行时创建对象:
var re = new RegExp('foo', 'gi');
将其应用于您的代码:
var chunk = String(arr[i]); // use String() only if you are not sure if arr[i] is
// Be aware that the following line is replacing only the first $
// char and you may want to scape other meta-characters:
chunk = chunk.replace('$', '\\$');
var a = message.match(new RegExp(chunk,'gi'));
if(a instanceof Array) symbol = symbol.concat(a);
答案 1 :(得分:0)
所以 - 我在问题区域(自然地)试了一下try / catch来尝试获得关于错误的某种反馈。有趣的是,我没有错误,问题就消失了。怪异。
解决方案:
try {
var chunk = String(arr[i]);
chunk = chunk.replace('$', '\\$');
var a = eval('message.match(/' + chunk + '/gi);');
if(a instanceof Array) symbol = symbol.concat(a);
} catch(e) {}