한 번의 문장에 중괄호를 남겨두면 JavaScript에서 해로울 수 있다고 들었습니다. 더 이상 추론을 기억하지 못하고 Google 검색은별로 도움이되지 않았습니다.
JavaScript에서 중괄호 안에있는 모든 문장을 둘러싸는 것이 좋은 아이디어가 있습니까?
모두가 그렇게 보이기 때문에 묻습니다.
한 번의 문장에 중괄호를 남겨두면 JavaScript에서 해로울 수 있다고 들었습니다. 더 이상 추론을 기억하지 못하고 Google 검색은별로 도움이되지 않았습니다.
JavaScript에서 중괄호 안에있는 모든 문장을 둘러싸는 것이 좋은 아이디어가 있습니까?
모두가 그렇게 보이기 때문에 묻습니다.
답변:
그러나 그들은 추천합니다. 성명을 확장하면 성명서가 필요합니다.
이것은 완벽하게 유효합니다
if (cond)
alert("Condition met!")
else
alert("Condition not met!")
그러나 항상 중괄호를 사용하는 것이 좋습니다. 본인이나 다른 사람이 명령문을 확장하는 경우에는 명령문이 필요하기 때문입니다.
이 방법은 모든 C 구문 스타일 언어에서 브레이스가 적용됩니다. C, C ++, Java, 심지어 PHP도 모두 중괄호없이 한 줄 명령문을 지원합니다. 당신은 당신이 두 문자 만 저장 하고 일부 사람들의 브레이싱 스타일로 줄을 저장하지 않는다는 것을 알아야합니다 . 나는 전체 괄호 스타일 (다음과 같은)을 선호하므로 조금 더 길어집니다. 코드 가독성이 매우 명확하다는 사실을 잘 알고 있습니다.
if (cond)
{
alert("Condition met!")
}
else
{
alert("Condition not met!")
}
가독성 측면이 있습니다. 복합 문장이있을 때는 매우 혼란 스러울 수 있습니다. 들여 쓰기는 컴파일러 / 통역사에게 도움이되지만 의미하는 것은 아닙니다.
var a;
var b;
var c;
//Indenting is clear
if (a===true)
alert(a); //Only on IF
alert(b); //Always
//Indenting is bad
if (a===true)
alert(a); //Only on IF
alert(b); //Always but expected?
//Nested indenting is clear
if (a===true)
if (b===true)
alert(a); //Only on if-if
alert (b); //Always
//Nested indenting is misleading
if (a===true)
if (b===true)
alert(a); //Only on if-if
alert (b); //Always but expected as part of first if?
//Compound line is misleading
//b will always alert, but suggests it's part of if
if (a===true) alert(a);alert(b);
else alert(c); //Error, else isn't attached
그리고 확장 성 측면이 있습니다.
//Problematic
if (a===true)
alert(a);
alert(b); //We're assuming this will happen with the if but it'll happen always
else //This else is not connected to an if anymore - error
alert(c);
//Obvious
if (a===true) {
alert(a); //on if
alert(b); //on if
} else {
alert(c); //on !if
}
생각은 항상 괄호가 있다면 그 블록 안에 다른 문장을 삽입하는 것을 알고 있다는 것입니다.
if (a===true) alert(a);. 지금은 분명하다!
질문은 한 줄로 진술에 대해 묻습니다. 그러나 제공된 많은 예제는 여러 줄로 된 문장을 기반으로 중괄호를 생략하지 않는 이유를 보여줍니다. 원하는 코딩 스타일 인 경우 한 줄에 대괄호를 사용하지 않는 것이 안전합니다.
예를 들어, 질문은 이것이 정상인지 묻습니다.
if (condition) statement;
이것이 정상인지 묻지 않습니다.
if (condition)
statement;
필자는 대괄호를 생략하는 것이 덜 불필요한 구문으로 코드를 더 읽기 쉽게 만들기 때문에 바람직하다고 생각합니다.
내 코딩 스타일은 코드가 블록이 아닌 한 대괄호를 사용하지 않는 것입니다. 그리고 한 줄에 세미콜론으로 구분하여 여러 명령문을 사용하지 마십시오. 나는 이것이 읽기 쉽고 명확하며 'if'문법에 대한 범위 지정 문제가 결코 없다는 것을 알았습니다. 결과적으로 단일 if 조건문에 대괄호를 사용하려면 3 행이 필요합니다. 이처럼 :
if (condition) {
statement;
}
if 문은 세로 공간을 덜 사용하고 코드가 더 작기 때문에 if 문을 사용하는 것이 좋습니다.
다른 사람들 이이 방법을 사용하도록 강요하지는 않지만 저에게 효과적이며 괄호를 생략하면 코딩 / 범위 지정 오류가 발생하는 방법에 대한 예제에 더 동의하지 않습니다.
/*eslint curly: ["error", "multi"]*/
기술적으로는 아니지만 그렇지 않으면 절대적으로 그렇습니다 !!!
"개인 취향", "코드가 제대로 실행", "나를 위해 잘 작동했습니다", "더 읽기 쉬운", yada yada BS를 잊어 버리십시오. 실수를하고 코딩 할 때 실수를 저지르는 것이 매우 쉽다고 생각하면 이것은 매우 심각한 문제로 이어질 수 있습니다 (믿지 마십시오?, 유명한 Apple이 버그에 실패 하는 것을 확인하십시오) ).
주장 : "개인 취향"
전혀 그렇지 않다. 당신이 화성으로 떠나는 한 남자 팀이 아니라면 대부분의 경우 다른 사람들이 코드를 읽거나 수정합니다. 심각한 코딩 팀에서는 이것이 권장되는 방법이므로 '개인 취향'이 아닙니다.
인수 : "코드가 제대로 실행됩니다"
스파게티 코드도 마찬가지입니다! 생성해도된다는 의미입니까?
주장 : "그것은 나에게 잘 작동했다"
내 경력 에서이 문제로 인해 너무 많은 버그가 발생했습니다. 'DoSomething()'왜 'SomethingElse()'전화를 받았는지에 대해 몇 번이나 논평 하고 당황 했는지 기억하지 못할 것입니다 .
if (condition)
DoSomething();
SomethingElse();
또는 'SomethingMore'를 추가했지만 들여 쓰기가 다른 것을 암시하더라도 호출되지 않는 것을 보지 못했습니다.
if (condition)
DoSomething();
SomethingMore();
여기 내가 가진 실제 사례가 있습니다. 누군가가 모든 로깅을 해제하여 find & replace "console.log"=>를 실행하려고했습니다 //"console.log".
if (condition)
console.log("something");
SomethingElse();
문제가 보입니까?
"이것은 너무나 사소한 일이지만 결코 그렇게하지 않을 것입니다."라고 생각하더라도; 당신보다 프로그래밍 기술이 열등한 팀원이 항상 있다는 것을 기억하십시오.
인수 : "더 읽기 쉽다"
프로그래밍에 대해 배운 것이 있다면 간단한 것들은 매우 빠르게 복잡해집니다. 이것은 매우 일반적입니다 :
if (condition)
DoSomething();
다른 브라우저 / 환경 / 사용 사례로 테스트되거나 새로운 기능이 추가 된 후 다음으로 바뀝니다.
if (a != null)
if (condition)
DoSomething();
else
DoSomethingElse();
DoSomethingMore();
else
if (b == null)
alert("error b");
else
alert("error a");
그리고 이것을 이것과 비교하십시오 :
if (a != null) {
if (condition) {
DoSomething();
}
else {
DoSomethingElse();
DoSomethingMore();
}
} else if (b == null) {
alert("error b");
} else {
alert("error a");
}
추신 : 보너스 포인트는 위의 예에서 버그를 발견 한 사람에게 전달됩니다.
유지 보수성 문제가 없습니다!
여러분 모두의 문제는 모든 곳에 세미콜론을 두는 것입니다. 여러 명령문에 중괄호가 필요하지 않습니다. 문장을 추가하려면 쉼표 만 사용하십시오.
if (a > 1)
alert("foo"),
alert("bar"),
alert("lorem"),
alert("ipsum");
else
alert("blah");
이것은 예상대로 실행되는 유효한 코드입니다!
if, else그리고 alert이 아니라 If, Else와 Alert?
@Josh K (Java, C 등에 적용됨)에서 언급 한 이유 외에도 JavaScript의 특별한 문제 중 하나는 자동 세미콜론 삽입 입니다. Wikipedia 예제에서 :
return
a + b;
// Returns undefined. Treated as:
// return;
// a + b;
따라서 다음과 같이 사용하면 예기치 않은 결과가 발생할 수도 있습니다.
if (x)
return
a + b;
쓰는 것이별로 좋지 않습니다.
if (x) {
return
a + b;
}
그러나 어쩌면 여기서 오류가 조금 더 쉽게 감지 될 수 있습니까 (?)
스타일 문제이지만, 중괄호는 다른 사람의 매달려있는 것을 방지하는 데 좋습니다 .
추천되는 이유는 다음과 같습니다.
내가 쓴다고합시다
if(someVal)
alert("True");
다음 개발자가 와서 "아, 다른 일을해야 해요"라고 말합니다.
if(someVal)
alert("True");
alert("AlsoTrue");
보시다시피 "AlsoTrue"는 항상 사실입니다. 첫 번째 개발자는 중괄호를 사용하지 않았기 때문입니다.
나는 현재 축소 기에서 일하고 있습니다. 지금도 두 개의 큰 스크립트에서 확인합니다. 실험적으로 내가 알아 냈습니다 : 중괄호에 ';', 'return', 'for', 'if', 'else'가 포함되어 있지 않으면 함수 중 *에 대해 중괄호를 제거 할 수 있습니다. 'while', 'do', 'function'입니다. 무관 한 줄 바꿈.
function a(b){if(c){d}else{e}} //ok
function a(b){if(c)d;else e} //ok
물론 닫는 중괄호가 뒤에 나오지 않으면 닫는 중괄호를 세미콜론으로 바꿔야합니다.
함수는 쉼표로 끝나서는 안됩니다.
var a,b=function()c; //ok *but not in Chrome
var b=function()c,a; //error
Chrome 및 FF에서 테스트되었습니다.
자바 스크립트에는 많은 문제가 있습니다. JavaScript 설계자 Douglas Crockford를 살펴보십시오 . if 문은 문제가 없지만 return 문은 문제를 일으킬 수 있습니다.
return
{
ok:false;
}
//silent error (return undefined)
return{
ok:true;
}
//works well in javascript
명령문의 시작 들여 쓰기 레벨은 그 위에있는 열린 중괄호 수와 같아야합니다. (따옴표 또는 주석 처리 된 중괄호 또는 전 처리기 지시문의 중괄호 제외)
그렇지 않으면 K & R은 들여 쓰기 스타일이 좋습니다. 스타일을 고치려면 간단한 간단한 if 문을 한 줄에 배치하는 것이 좋습니다.
if (foo) bar(); // I like this. It's also consistent with Python FWIW
대신에
if (foo)
bar(); // not so good
편집기를 작성하는 경우 자동 형식 버튼을 사용하여 막대를 foo와 같은 줄로 빨리 게 만들고 다음과 같이 전에 return 키를 누르면 막대 주위에 중괄호를 삽입합니다.
if (foo) {
bar(); // better
}
그런 다음 if 문의 본문 내에서 막대 위 또는 아래에 새 명령문을 추가하는 것이 쉽고 일관됩니다.
if (foo) {
bar(); // consistent
baz(); // easy to read and maintain
}
때때로 그들은 필요한 것 같습니다! 나는 그것을 스스로 믿을 수 없었지만 어제 Firebug 세션 (최근 Firefox 22.0)에서 나에게 발생했습니다.
if (! my.condition.key)
do something;
실행 뭔가 할 에도 불구하고 my.condition.key가 있었다 true . 중괄호 추가 :
if (! my.condition.var) {
do something;
}
그 문제를 해결했습니다. 중괄호없이 분명히 작동하는 수많은 예가 있지만이 경우 분명히 그렇지 않습니다.
한 줄에 둘 이상의 진술을하는 경향이있는 사람들은 반드시 은 물론 중괄호를 사용해야합니다.
if (condition)
do something; do something else;
찾기가 어렵습니다.
나는 중괄호를 다른 것에 버려 둘 수 있음에 유의하고 싶습니다. 이 기사 에서 볼 수 있듯이 John Resig 's .
if(2 == 1){
if(1 == 2){
console.log("We will never get here")
}
} else
console.log("We will get here")
else괄호 사용법과 일치하도록 양쪽에 블록 이 필요합니다.이 예 else에서는 코드 검토를 통과하기 위해 블록에 괄호가 필요합니다 . [1] : wiki.qt.io/Qt_Coding_Style#Braces