15

我正在查看 GMail 执行的一些 AJAX 调用,我注意到有时调用的返回值以数字开头。示例:(注意第一行后面没有分号)

3 
[1, 2];

如果我将它输入到 JavaScript 控制台,我会得到 undefined 返回。但是,如果第二个参数是数字或字符串,我会返回第二个参数。例子:

3
4

返回 4。

我的猜测是他们这样做是为了阻止 jsonp 类型的攻击,但是,有谁知道正在进行什么基础评估?在第二种情况下,我相信在第一行之后“插入”一个分号,这将使返回 4 有意义。但是,我想不出第一个表达式返回未定义的原因。

4

2 回答 2

9

这是因为 ASI(自动分号插入)的工作原理。第一条语句被解释为

3[1,2];

就是这样undefined。ASI 将第二个解释3;4;4.

ASI 规则在某些情况下是违反直觉的,例如您可能想知道为什么数字和括号之间没有分号?嗯,这是有原因的。阅读这些资源以获取更多详细信息:

JavaScript 的自动分号插入 (ASI) 的规则是什么?

http://bclary.com/2004/11/07/#a-7.9.1

谷歌可能会给你更多的结果。:) 这就是为什么我们有无休止的无分号 JavaScript战争。

于 2013-01-31T17:03:57.373 回答
7

这是为了防止 Ajax JSON hack 更改 Array 构造函数。这是一个旧错误,与现代浏览器无关,但必须处理。

hack 覆盖了 Array 构造函数,因此当读取 JSON 时,代码将执行构造函数的操作。更多解释:http: //haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

顺便说一句,这就是 ASP.NET 总是发回此类对象的原因:{d: []}.

于 2013-01-31T17:01:37.427 回答