자바 스크립트에는 두 가지 인기있는 클로저 스타일이 있습니다.클로저 스타일의 차이점
new function() {
var code...
}
과 인라인 실행 기능 : 그 두 사이에 동작의 차이가
(function() {
var code...
})();
가 처음 나는 익명 생성자 전화? 하나가 다른 것보다 "더 나은가?"
자바 스크립트에는 두 가지 인기있는 클로저 스타일이 있습니다.클로저 스타일의 차이점
new function() {
var code...
}
과 인라인 실행 기능 : 그 두 사이에 동작의 차이가
(function() {
var code...
})();
가 처음 나는 익명 생성자 전화? 하나가 다른 것보다 "더 나은가?"
질문 ;-) 아니었다, 유일한 진짜 차이는 식의 반환 값이 될 것인가, 그리고 "this"의 값이 함수 내부에있을 것입니다.
는 기본적으로
new expression
의 동작은 물론 tempObject과 결과가 과도 값이다의 (가 인터프리터 구현 세부 사항이야) 당신이 보지 못할 수 있지만
var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
result = tempObject;
효과적으로 동일하고, "개체가 아닙니다"체크를 수행 할 JS 메커니즘이 없습니다.
"new function() {..}"메서드는 생성자에 대해이 개체를 만들 필요가 있기 때문에 속도가 느려집니다.
이는 객체 할당이 느리지 않고 실제 코드와 같은 코드를 사용하면 안되며 (함수 객체 및 관련 폐쇄를 생성하는 비용 때문에) 코드를 사용하면 안됩니다.
편집 : 내가 놓친 것 중 하나는 tempObject
이 expression
의 프로토 타입을 얻는 것입니다. . 내가 기대하지 않았다 "는 경고가 모두"방법 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
두 번째 예제는 함수를 만든 후에 함수를 실행합니다.
편집 : 이것은 사실이 아닙니다.
@Lance : 첫 번째도 실행 중입니다. 명명 된 생성자와 비교해보십시오.
function Blah() {
alert('blah');
}
new Bla();
실제로 이것은 또한 코드를 실행합니다. 같은 익명 생성자에 간다 ...
그러나이 두 경우 모두이 기능을 실행합니다잘합니다 (expression.call
전),이 같은 페이지를 만들어 "방법 1"경고 할 수 있습니다. 차이점은 a와 b의 값이었습니다 .a는 함수 자체이고 b는 함수가 반환 한 문자열입니다.
예, 두 가지의 차이점이 있습니다.
두 가지 모두 익명 함수입니다. 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 함수!
따라서 두 번째 방법이 더 안전하다고 생각합니다. 더 안전합니다!
둘 다 코드 블록을 실행하여 클로저를 만듭니다. 스타일의 문제로서 저는 두 가지 이유로 두 번째를 더 선호합니다 :
처음에는 코드가 실제로 실행될 것이라는 것을 즉시 눈치 채지 못했습니다. 이 인 것처럼 보입니다. 입니다. 생성자로 실행하지 않고 새 함수를 작성하는 것이지만 실제로는 발생하지 않습니다. 코드가 실행되는 것처럼 보이지 않는 코드를 피하십시오!
(function(){
... })();
좋은 북 엔드 토큰을 만들어 클로저 범위를 입력하고 나가는 것을 바로 확인할 수 있습니다. 프로그래머가 범위 변경 내용을 읽도록 알려주기 때문에 좋으며 축소 작업과 같이 파일의 후 처리 작업을 수행하는 경우 특히 유용합니다.
-1 이것은 "a"를 "a"전에 "var"를 생략하여 글로벌하게 만들고 질문과 관련이 없기 때문입니다. – Tomas