2008-08-08 3 views
18

자바 스크립트에는 두 가지 인기있는 클로저 스타일이 있습니다.클로저 스타일의 차이점

new function() { 
    var code... 
} 

인라인 실행 기능 : 그 두 사이에 동작의 차이가

(function() { 
    var code... 
})(); 

가 처음 나는 익명 생성자 전화? 하나가 다른 것보다 "더 나은가?"

답변

7

질문 ;-) 아니었다, 유일한 진짜 차이는 식의 반환 값이 될 것인가, 그리고 "this"의 값이 함수 내부에있을 것입니다.

는 기본적으로

new expression 

의 동작은 물론 tempObject과 결과가 과도 값이다의 (가 인터프리터 구현 세부 사항이야) 당신이 보지 못할 수 있지만

var tempObject = {}; 
var result = expression.call(tempObject); 
if (result is not an object) 
    result = tempObject; 

효과적으로 동일하고, "개체가 아닙니다"체크를 수행 할 JS 메커니즘이 없습니다.

"new function() {..}"메서드는 생성자에 대해이 개체를 만들 필요가 있기 때문에 속도가 느려집니다.

이는 객체 할당이 느리지 않고 실제 코드와 같은 코드를 사용하면 안되며 (함수 객체 및 관련 폐쇄를 생성하는 비용 때문에) 코드를 사용하면 안됩니다.

편집 : 내가 놓친 것 중 하나는 tempObjectexpression의 프로토 타입을 얻는 것입니다. . 내가 기대하지 않았다 "는 경고가 모두"방법 1 "과 방법 2 (어쨌든 나에게)

<html> 
<body> 
<script type="text/javascript"> 
var a = new function() { 
    alert("method 1"); 

    return "test"; 
}; 

var b = (function() { 
    alert("method 2"); 

    return "test"; 
})(); 

alert(a); //a is a function 
alert(b); //b is a string containing "test" 

</script> 
</body> 
</html> 

놀랍게도 : tempObject.__proto__ = expression.prototype

0

두 번째 예제는 함수를 만든 후에 함수를 실행합니다.

편집 : 이것은 사실이 아닙니다.

5

@Lance : 첫 번째도 실행 중입니다. 명명 된 생성자와 비교해보십시오.

function Blah() { 
    alert('blah'); 
} 
new Bla(); 

실제로 이것은 또한 코드를 실행합니다. 같은 익명 생성자에 간다 ...

그러나이 두 경우 모두이 기능을 실행합니다

0

잘합니다 (expression.call 전),이 같은 페이지를 만들어 "방법 1"경고 할 수 있습니다. 차이점은 a와 b의 값이었습니다 .a는 함수 자체이고 b는 함수가 반환 한 문자열입니다.

-4

예, 두 가지의 차이점이 있습니다.

두 가지 모두 익명 함수입니다. nd는 똑같은 방식으로 실행됩니다. 그러나 둘 사이의 차이는 두 번째 경우 변수의 범위가 익명 함수 자체로 제한된다는 것입니다.실수로 전역 범위에 변수를 추가 할 가능성은 없습니다.

이것은 두 번째 방법을 사용하면 전역 변수 범위가 혼란스럽지 않음을 의미합니다.이 전역 변수 값이 다른 라이브러리에서 사용하거나 다른 전역 변수에서 사용할 수 있으므로 방해가 될 수 있습니다. 타사 라이브러리.

예 : 위의 코드에서

<html> 
<body> 
<script type="text/javascript"> 

new function() { 
a = "Hello"; 
alert(a + " Inside Function"); 
}; 

alert(a + " Outside Function"); 

(function() { 
var b = "World"; 
alert(b + " Inside Function"); 
})(); 

alert(b + " Outside Function"); 
</script> 
</body> 
</html> 

출력은 같은 것입니다 : 함수 외부

안녕하세요 내부 기능
안녕하세요
세계 내부 기능

.. 그러면 'b'가 정의되지 않은 오류가 발생합니다. ide 함수!

따라서 두 번째 방법이 더 안전하다고 생각합니다. 더 안전합니다!

+1

-1 이것은 "a"를 "a"전에 "var"를 생략하여 글로벌하게 만들고 질문과 관련이 없기 때문입니다. – Tomas

3

둘 다 코드 블록을 실행하여 클로저를 만듭니다. 스타일의 문제로서 저는 두 가지 이유로 두 번째를 더 선호합니다 :

처음에는 코드가 실제로 실행될 것이라는 것을 즉시 눈치 채지 못했습니다. 인 것처럼 보입니다. 입니다. 생성자로 실행하지 않고 새 함수를 작성하는 것이지만 실제로는 발생하지 않습니다. 코드가 실행되는 것처럼 보이지 않는 코드를 피하십시오!

(function(){ ... })(); 좋은 북 엔드 토큰을 만들어 클로저 범위를 입력하고 나가는 것을 바로 확인할 수 있습니다. 프로그래머가 범위 변경 내용을 읽도록 알려주기 때문에 좋으며 축소 작업과 같이 파일의 후 처리 작업을 수행하는 경우 특히 유용합니다.