오늘 저는 JavaScript patterns O’Reilly 책을 무작위로 읽는 동안 흥미로운 점을 발견했습니다 (참조 용 27 페이지).
Javascript에서는 경우에 따라 중괄호 시작 위치가 다른 경우 차이가 있습니다.
function test_function1() {
return
{
name: 'rajat'
};
}
var obj = test_function1();
alert(obj); //Shows "undefined"
동안
function test_function2() {
return {
name: 'rajat'
};
}
var obj = test_function2();
alert(obj); //Shows object
다른 언어에도 그러한 행동이 있습니까? 그렇다면 확실히 습관을 바꿔야 할 것입니다 .. 🙂
저는 주로 PHP, C, C ++, Java 및 루비에 관심이 있습니다.
답변
문을 구분하기 위해 세미콜론 (대신 개행)에 의존하지 않는 모든 언어는 잠재적으로이를 허용합니다. Python을 고려하십시오 .
>>> def foo():
... return
... { 1: 2 }
...
>>> def bar():
... return { 1: 2 }
...
>>> foo()
>>> bar()
{1: 2}
Visual Basic 에서 비슷한 케이스를 구성 할 수는 있지만 VB가 값을 배치 할 수있는 위치에 매우 제한적이기 때문에 어떻게해야할지 알 수 없습니다. 그러나 정적 분석기가 도달 할 수없는 코드에 대해 불평하지 않는 한 다음은 작동합니다.
Try
Throw New Exception()
Catch ex As Exception
Throw ex.GetBaseException()
End Try
' versus
Try
Throw New Exception()
Catch ex As Exception
Throw
ex.GetBaseException()
End Try
언급 한 언어에서 Ruby 는 동일한 속성을 가지고 있습니다. PHP, C, C ++ 및 Java는 단순히 줄 바꿈을 공백으로 버리고 명령문을 구분하기 위해 세미콜론을 필요로하기 때문이 아닙니다.
다음은 Ruby의 Python 예제에 해당하는 코드입니다.
>> def foo
>> return { 1 => 2 }
>> end
=> nil
>> def bar
>> return
>> { 1 => 2 }
>> end
=> nil
>> foo
=> {1=>2}
>> bar
=> nil
답변
자바 스크립트 인터프리터는 자동으로 ;
각 줄 끝에를 추가합니다 .
따라서 기본적으로 문제는 중괄호의 위치 (여기서는 대부분의 언어에서와 같이 코드 블록이 아닌 객체 리터럴을 나타냄)가 아니라 첫 번째 예제를 return ;
=>로 강제하는이 작은 “기능”입니다 undefined
. return
ES5 사양에서의 동작을 확인할 수 있습니다 .
유사한 동작을하는 다른 언어에 대해서는 Konrad의 답변을 확인하십시오 .
답변
거의 확실히. Google의 go 프로그래밍 언어는 매우 유사한 동작을 나타냅니다 (효과는 다르지만). 거기에 설명 된대로 :
사실 공식 언어는 C 나 Java에서와 같이 세미콜론을 사용하지만 문장의 끝처럼 보이는 모든 줄 끝에 자동으로 삽입됩니다. 직접 입력 할 필요가 없습니다.
..한조각…
이 접근 방식은 깔끔하고 세미콜론이없는 코드를 만듭니다. 한 가지 놀라운 점은 if 문과 같은 구문의 여는 중괄호를 if와 같은 줄에 두는 것이 중요하다는 것입니다. 그렇지 않으면 컴파일되지 않거나 잘못된 결과를 제공 할 수있는 상황이 있습니다. 언어는 중괄호 스타일을 어느 정도 강제합니다.
비밀리에 Rob Pike는 One True Brace Style을 요구하는 변명을 원했습니다.
답변
그 질문에 대한 답은 상당히 쉽습니다. “자동 세미콜론 삽입”이있는 언어는 해당 줄에서 문제가 될 수 있습니다. 이것의 문제
return
{
name: 'rajat'
};
.. js 엔진이 return;
문 뒤에 세미콜론을 삽입 하므로 반환 undefined
합니다. 이 예는 항상 오른쪽에 중괄호를 열고 왼쪽에는 열지 않는 좋은 이유 입니다. 이미 올바르게 알아 차렸 기 때문에 같은 줄에 중괄호가 있으면 인터프리터는이를 알아 채고 세미콜론을 삽입 할 수 없습니다.
답변
FWIW, JSLint 는 해당 구문으로 몇 가지 경고를보고합니다.
$ jslint -stdin
function foo(){
return
{ x: "y" };
}
^D
(3): lint warning: unexpected end of line; it is ambiguous whether these lines are part of the same statement
return
........^
(3): lint warning: missing semicolon
{ x: "y" };
..^
(3): lint warning: unreachable code
{ x: "y" };
..^
(3): lint warning: meaningless block; curly braces have no impact
{ x: "y" };
..^
(3): lint warning: use of label
{ x: "y" };
.....^
(3): lint warning: missing semicolon
{ x: "y" };
...........^
(3): lint warning: empty statement or extra semicolon
{ x: "y" };
............^
0 error(s), 7 warning(s)
답변
내가 이것을 발견 한 첫 번째 언어는 awk (구문 “이상”의 몫도 있습니다. 선택적인 세미콜론, 공백 만 사용하는 문자열 연결 등 …) D 구문을 느슨하게 기반으로 한 DTrace 디자이너가 생각합니다. awk에, 이러한 기능을 복사하지 않을 충분한 감각이 있었지만 머리 꼭대기에서 기억할 수 없습니다. 간단한 예 (Mac에서 DTD의 ENTITY 태그 수 계산) :
$ cat printEntities.awk
# This prints all lines where the string ENTITY occurs
/ENTITY/ {
print $0
}
$ awk -f printEntities.awk < /usr/share/texinfo/texinfo.dtd | wc -l
119
대신이 작은 스크립트가 자체 줄에 중괄호로 작성 되었다면 다음과 같은 결과가 발생합니다.
$ cat printAll.awk
# Because of the brace placement, the print statement will be executed
# for all lines in the input file
# Lines containing the string ENTITY will be printed twice,
# because print is the default action, if no other action is specified
/ENTITY/
{
print $0
}
$ awk -f printAll.awk < /usr/share/texinfo/texinfo.dtd | wc -l
603
$ /bin/cat < /usr/share/texinfo/texinfo.dtd | wc -l
484
$