记一个行结束符引发的JS报错

问题描述

最近遇到一个神奇的Bug,通过UIWebViewstringByEvaluatingJavaScriptFromString:方法执行一段JavaScript代码时,JavaScript报错:

SyntaxError: Unexpected EOF

经过仔细的排查,发现待执行的JavaScript代码里面包含U+2028字符。还找到了Stack Overflow相关讨论
JavaScript解析器会把行分隔符U+2028和段落分隔符U+2029解析成一行的结束,代码里要是包含这两个字符相当于换行,例如:

alert(“\u2028”)

就会被解析为

alert(“
“)

于是就产生了语法错误。

解决方案

我用的方法比较简单、粗暴,在执行JavaScript代码前,直接过滤掉这两个字符。代码如下:

1
2
3
4
// 
javaScriptString = [javaScriptString stringByReplacingOccurrencesOfString:@"\u2028" withString:@""];
javaScriptString = [javaScriptString stringByReplacingOccurrencesOfString:@"\u2029" withString:@""];
NSString* ret = [(UIWebView*)_engineWebView stringByEvaluatingJavaScriptFromString:javaScriptString];