在 Javascript 中,我们可以直接在字符串文字上调用方法,而无需将其括在圆括号中。但不适用于其他类型,例如数字或函数。这是一个语法错误,但是否有理由说明为什么 Javascript 词法分析器需要将这些其他类型括在圆括号中?
例如,如果我们使用 alert 方法扩展 Number、String 和 Function 并尝试在字面量上调用此方法,则它对于 Number 和 Function 是 SyntaxError,而它适用于 String。
function alertValue() {
alert(this);
}
Number.prototype.alert = alertValue;
String.prototype.alert = alertValue;
Function.prototype.alert = alertValue;
我们可以直接在字符串对象上调用 alert:
"someStringLiteral".alert() // alerts someStringLiteral
但这是数字和函数的语法错误。
7.alert();
function() {}.alert();
要使用这些类型,我们必须将其括在括号中:
(7).alert(); // alerts "7"
(function() {}).alert(); // alerts "function() {}"
更新:
@Crescent 的链接和@Dav 和@Timothy 的回答解释了为什么7.alert()
失败,因为它正在寻找一个数字常量,并且要通过它,插入额外的空格或额外的点。
7 .alert()
7..alert()
7. .alert();
为什么在对函数调用方法之前需要将函数括在括号中,是否存在类似的语法原因?
我不太熟悉解释器和词法分析器,不知道这是否是一个可以通过某种前瞻来解决的问题,因为 Ruby 是一种动态语言并且可以解决这个问题。例如:-
7.times { |i| print i }
更新 2:
@CMS 的答案在理解为什么上面的函数不起作用。以下陈述有效:
// comma operator forces evaluation of the function
// alerts "function() {}"
<any literal>, function() {}.alert();
// all examples below are forced to be evaluated as an assignment expression
var a = function() {}.alert();
var b = {
x: function() { return "property value" }.alert()
}
[ function() { return "array element" }.alert() ];