2012-04-09 5 views
3

개체를 초기화 할 때 추가 괄호의 의미는 무엇입니까? 예를 들어 :모듈 패턴 함수 초기화 스타일

var foo = function(){ ... }(); 

var foo = (function(){ ... }()); 

대 나는 범위와 관련된 무엇인가를 생각하지만 그들은 모두가 어떤 각을 기반으로 객체를 초기화하는 것 때문에 누군가가 특정 차이점에 대한보다 정확한 될 수 있는지 궁금 해서요 익명의 함수가 반환됩니다.

+2

에 대한 다음과 같은 오류를 제공합니다. 어떤 사람들은 바깥 쪽''(...) ''를 좋아합니다. 왜냐하면'= '연산자 근처에서 함수가 호출되는 시각적 힌트를주기 때문입니다. –

+0

당신은 내가 upvote 수 있도록 대답으로 게시해야합니다. :) – t3rse

+0

알겠습니다. http://stackoverflow.com/a/10078589/1106925 –

답변

5

, 효과적인 차이가 없습니다.

어떤 사람들은 바깥 쪽 (...)을 좋아하는데, 이는 그 사람에게 그 기능이 호출되고있는 = 연산자 근처의 시각적 인 힌트를주기 때문입니다.

그러나 대입 연산자를 사용하면 function이 대입 연산자의 오른쪽 피연산자 인 표현식으로 평가되므로 더 이상 함수 선언 밖으로 강제 변환하지 않아도 호출 될 수 있습니다. 할당없이


, 일부 구문은 그 인터프리터는 function 키워드가 익명 함수의 표현으로 사용되고 있음을 알 수 있습니다 관련이있을 필요가있다. 예를 들어

... 여기

(function() { 
    // code 
})(); 

는 괄호는이 (...) 그룹 내에서 하나의 표현으로 처리됩니다 그래서 function의 모호성을 해결.


그룹핑 연산자 표현으로 평가하는 function 강제의 한 방법이다. 대부분의 JavaScript 연산자는이 목적으로 사용될 수 있습니다. 단항 연산자는 function는 각각의 운전자에 하나의 값으로서 알 수있다 .. 두 경우

void function() { 
    // code 
}(); 

... 예를 들어, 아마도

!function() { 
    // code 
}(); 

... 또는 안전하다.

2

두 기능적으로 동일합니다.

는하지만, 규칙으로, 많은 프로그래머는 VAR이 함수의 결과가 아닌 함수 자체입니다 나타 내기 위해 여는 괄호를 선호합니다.

자동 호출 기능의 사용은 자신의 "네임 스페이스"를 보존하기 위해 변수에 전달하는 것입니다, 예를 들어, 창이나 문서 또는 JQuery와 같은 다른 것들에 통과하는 것이 일반적이다.

jslint에 대한 몇 가지 빠른 테스트에 따르면, 다음과 같은 테스트에서 첫 번째 (foo) 방법이 선호됩니다.

var foo = (function() {}()); 
var bar = (function() {})(); 
var baz = function() {}(); 

invoking()는 바깥 괄호 안쪽에 있습니다.

JSLint는 효과적인 차이가 없다, 특정 경우 바, 바즈

Error:

Problem at line 2 character 28: Move the invocation into the parens that contain the function.

var bar = (function (w) {})(window);

Problem at line 3 character 27: Wrap an immediate function invocation in parentheses to assist the reader in understanding that the expression is the result of a function, and not the function itself.

var baz = function (w) {}(window);