2012-01-29 2 views
97

가능한 중복은 :
What is the (function() { })() construct in JavaScript?고급 JavaScript :이 함수는 왜 괄호 안에 싸여 있습니까?

나는 자바 스크립트 코드의이 비트를 건너 왔어요,하지만 난 그것을 밖으로 만드는 무엇인지 전혀 모른다. 이 코드를 실행할 때 "1"이되는 이유는 무엇입니까? 이 (1)의 이상한 작은 부록은 무엇이며 왜 함수는 괄호 안에 싸여 있습니까?

(function(x){ 
    delete x; 
    return x; 
})(1); 
+0

이것은 IIFE입니다. 자세한 내용은 http://www.markupjavascript.com/2016/07/what-are-immediately-invoked-function.html –

답변

208

여기에 몇 가지가 있습니다. 이것은 자신의 범위에 약간의 자바 스크립트 코드를 실행하는 방법을 제공

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

: 첫 번째는 immediately invoked function expression (인생) 패턴이다. 함수 내에서 생성 된 모든 변수가 전역 범위에 영향을주지 않도록 일반적으로 사용됩니다. 대신이를 사용할 수 있습니다

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

그러나 이것은 항상 필요하지 않은 기능에 이름을 부여해야합니다. 명명 된 함수를 사용한다는 것은 미래의 어떤 시점에서 함수가 다시 호출 될 수 있다는 것을 의미하기 때문에 바람직하지 않을 수 있습니다. 이 방식으로 익명의 함수를 사용하면 한 번만 실행됩니다.

이 구문이 잘못되었습니다 :

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

당신이 그것을 표현으로 분석하기 위해 괄호의 기능을 포장해야하기 때문에. 자세한 내용은 여기에 있습니다 : 자신의 범위 내에 그냥 인라인으로 기록 된 것처럼,

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

이 있습니다 즉시 실행해야 할 '몇 가지 코드'만 : 그래서

http://benalman.com/news/2010/11/immediately-invoked-function-expression/은 인생의 패턴을 신속하게 요약하자면 전역 네임 스페이스에 영향을 미치지 않도록 (따라서 다른 스크립트를 방해하거나 간섭 할 수 있음).

당신은 마찬가지로 함수에 인수를 전달할 수 있습니다

당신 것 정상적인 기능, 예를 들어,

(function(x) { 
    // Some code 
})(1); 

그래서 우리는 가치를 전달하는 '1'을받는 함수의 첫 번째 인수로

x로 명명 된 지역적으로 범위가 지정된 변수로. delete 연산자는 객체에서 속성을 제거합니다

delete x; 
return x; 

:

둘째, 당신은 기능 코드 자체의 내장을 가지고있다. 변수를 삭제하지 않습니다. 그래서; 이것에

var foo = {'bar':4, 'baz':5}; 
delete foo.bar; 
console.log(foo); 

결과가 기록되고 : 푸 변수 아닌 속성 때문에

var foo = 4; 
delete foo; 
console.log(foo); 

이 값 4를 기록 할 것 등이 될 수 없다

{'baz':5} 

반면 삭제됨

많은 사람들은 자동 전역 (autoglobals)이 작동하는 방식 때문에 삭제가 변수를 삭제할 수 있다고 가정합니다. 당신이 변수를 삭제하지 있기 때문에,

bar = 4; // Note the lack of 'var'. Bad practice! Don't ever do this! 
delete bar; 
console.log(bar); // Error - bar is not defined. 

이번에 삭제 작동하지만 : 당신이 먼저 선언하지 않고 변수에 할당하는 경우, 실제로 변수지만, 전역 객체의 속성이되지 않습니다 전역 객체의 속성

window.bar = 4; 
delete window.bar; 
console.log(window.bar); 

그리고 지금 당신은 foo는 개체의 예 아니라 foo는 변수 예와 유사 얼마나 볼 수 있습니다 : 실제로, 이전의 조각이 동일합니다.

+18

아주 좋은 설명! –

+1

매우 잘 설명해주세요. 또한, 측근으로서, 나는 더글라스 크록 포드 (Douglas Crockford)가 자신이 선호하는 ("function {{{}()) 대화에서 언급하는 것을 보았다. 효과적으로 IIFE 전체를 괄호로 묶어 선명하게 표현합니다. – GuiDoody

+0

위키 링크와 비교할 때, 괄호가 모든 것을 감싸고 있습니다. 차이가 있습니까? –

9

그것은 당신이 익명 함수를 생성하고, 매개 변수 1로 전화를 의미한다.

그것은 단지와 같습니다

function foo(x) { 
    delete x; 
    return x; 
} 
foo(1); 
+2

나는'var foo = function() {} '을 사용합니다. '기능 문과 함수 표현을 혼동하지 마십시오. – hugomg

+1

@missingno 그들은 동일합니다. – xdazz

1

여전히 반환 일이 삭제 키워드가 객체의 속성을 제거하기위한 것입니다받을 이유. 나머지는 다른 사람들이 주석을 달았 기 때문에, 괄호 안에 싸인 것은 무엇이든 함수로 실행되고, 대괄호의 두 번째 괄호는 그 블록에 전달 된 인수입니다.

여기에 익명 기능을 설명하는 MDN reference for deleteMDN reference for closures이 있습니다.

2

사람들은 일반적으로 이러한 "즉시 호출 된 함수 식"또는 "자체 실행 함수"를 호출합니다.

이 작업을 수행 할 시점은 해당 함수 내에서 선언 된 변수가 외부로 누출되지 않는다는 것입니다.