Javascriptでは、丸括弧で囲まずに文字列リテラルのメソッドを直接呼び出すことができます。ただし、数値や関数などの他のタイプは対象外です。これは構文エラーですが、Javascriptレクサーがこれらの他のタイプを丸括弧で囲む必要がある理由はありますか?
たとえば、アラートメソッドを使用してNumber、String、およびFunctionを拡張し、リテラルでこのメソッドを呼び出そうとすると、Stringに対しては機能しますが、NumberおよびFunctionのSyntaxErrorになります。
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() ];