2012-01-20 2 views
4

다른 방법으로, 세미콜론 삽입이 실패하고 코드가 깨진 채로 남아있는 이유는 무엇입니까?세미콜론을 사용하지 않는 것이이 코드를 중단시키는 이유는 무엇입니까?

function Foo() { } 

Foo.prototype.bar = function() { 
    console.log("bar"); 
} // <------------ missing semicolon 

(function() { 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
})(); 
왜 자바 스크립트 구문 분석 엔진 내 폐쇄에 무엇이와 Foo.prototype.bar = function() {을 결합하려고

? 이 합리적인 결론을 내릴 수있는 물건이 있습니까?

나는 세미콜론 삽입이 당신을 구할 것이라는 기대에 따라 세미콜론을 사용하지 말 것을 권하고 있지 않다. 나는 실수로 하나를 남겨 두었을 때 위 코드가 왜 (더 유용한 버전의) 코드가 고장 났는지 궁금 할뿐입니다.

답변

3

생각해 ...

Foo.prototype.bar = function() { // <-- 1. function 
    console.log("bar"); 
}(function() { // <-- 2. call the 1. function, passing a function argument 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
})(); // <-- 3. tries to invoke the return value of the 1. function, 
     //   but "undefined" was returned. 

나는 인생에 대한 ()를 사용하여 좋아하지 않는다. 나는 다른 사업자를 선호합니다.

Foo.prototype.bar = function() { 
    console.log("bar"); 
} 

void function() { 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
}(); 

원래로 돌아가서 첫 번째 함수가 함수를 반환하면 함수가 호출 된 것을 볼 수 있습니다. 할당에 사용됩니다

Foo.prototype.bar = function() { // <-- 1. function 

    console.log("bar"); 
    return function() { alert('INVOKED'); }; // 2. return a function 

}(function() { // <-- 3. call the 1. function, passing a function argument 
    Foo.prototype.la = function() { 
     console.log("la"); 
    }; 
})(); // <-- 4. tries to invoke the return value of the 1. function, 
     //   which will now call the returned function with the "alert()" 
@Lasse Reichstein에 의해 제안 여전히 왼쪽과 오른쪽 피연산자를 평가하는 바이너리 연산자, 단항 연산자를 사용하고 결과를 반환하도록 업데이트

.

+1

예 - 그래서 bar는 그 함수가 아니라 그 함수의 결과를 그 괄호 안에있는 것으로 호출 할 때 할당됩니다. 고맙습니다. –

+0

HEH - 나는 정직하게'+ function()'을 선호하는 유일한 사람이라고 생각했습니다. 그 사람은 저축꾼이라고 생각했습니다. :) –

+0

@AdamRackis : 우리 중에 몇 명이 있습니다. :) 너무 많은 문자가 걱정된다면 실제로'void '를 선호합니다. 더 두드러지는 것 같습니다. –

4

그 아래 줄에합니다 (보고 당신이 전화 인수로 아래의 기능을 사용하여 (위)에 원하는 의미를 걸리기 때문에. 이런 식의

+0

* 한숨 * - 잘 부탁드립니다. –

관련 문제