了解JavaScript文档中使用的函数的表示法

时间:2016-05-15 10:00:00

标签: javascript syntax callback

每当我在JS中看到任何语法时,都会以这种格式编写

{{1}}

为什么每个人都使用那种数组符号以及为什么逗号主要位于数组中? 为了表示回调也使用了这种语法,无法理解为什么?

1 个答案:

答案 0 :(得分:2)

当你在文档中看到这个时:

response.writeHead(statusCode[, statusMessage][, headers])

...这意味着您可以通过以下方式之一调用该方法:

response.writeHead(statusCode)
response.writeHead(statusCode, statusMessage)
response.writeHead(statusCode, headers)
response.writeHead(statusCode, statusMessage, headers)

因此语法表示法中的方括号表示某些内容是可选的。这也意味着逗号必须显示为。

悬空逗号

你的第二个例子实际上是一个不太准确的描述符:

window.setTimeout(func, [delay, param1, param2, ...]); 

因为从字面上看,它似乎允许这样:

window.setTimeout(func, );

但这是无效的语法,至少在JavaScript中这个语法描述符似乎是什么。

允许的参数数量

上面的描述符并没有明确表明你只能用2或3个参数调用这个方法,比如:

window.setTimeout(alert('hi'), 100); 

但很明显,事实就是如此。有些人宁愿写下这样的描述符:

window.setTimeout(func[, delay[, param1[, param2[, ...]]]]); 

没有人会提出第一个描述符的问题:很明显是什么意思。它是文档的一部分,而不是严格的语言。事实上,许多括号并没有真正增加这种描述符的可读性。这是一个在准确性和清晰度之间划清界线的问题。

省略号

另请注意,这些点意味着可以遵循更多参数。这个省略号也不能作为文字。这不应与作为某些语言语法一部分的省略号混淆(例如Javascript spread operator)。这再次表明这种文档约定不是一种非常严格的语言。

多个支架对

回到第一个例子。注意,所描述的方法具有两对括号。这实际上有一个含义,并表示在这个只有一对的替代描述符中不可见的可能性:

response.writeHead(statusCode[, statusMessage, headers])

不同之处在于此替代方案允许此调用:

response.writeHead(statusCode, headers)

如果想传递标题,那么他们还必须提供 statusMessage

response.writeHead(statusCode, statusMessage, headers)

但是,原始描述符确实允许这样做。这意味着所描述的方法非常智能,因为它支持对使用2个参数进行的调用的两种不同解释:

response.writeHead(statusCode, statusMessage)
response.writeHead(statusCode, headers)

这显然是因为具有 statusMessage 含义的值可以与具有 header 含义的值区分开来。在这种特殊情况下,nodejs在第二个参数是对象时将其视为标头,在它是原始值(字符串)时将其视为 statusMessage