【发布时间】:2011-02-13 04:06:57
【问题描述】:
在 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() ];
【问题讨论】:
-
“圆括号”被称为圆括号...
-
感谢@Crescent 的链接,它解释了数字,函数有类似的原因吗?
-
另外,不要像这个回答者那样思考:stackoverflow.com/questions/203739/…(需要更多反对票)。
-
@Jimmy,我在发布问题时努力记住“parantheses”,但就是想不起来:)。圆括号,虽然有点冗长也很常见。
标签: javascript syntax methods lexer