문제

자바스크립트에서는 언제 이것을 사용하고 싶습니까?

(function(){
    //Bunch of code...
})();

이에 대해:

//Bunch of code...
도움이 되었습니까?

해결책

가변 범위에 관한 모든 것. 자체 실행 기능에서 선언 된 변수는 기본적으로 자체 실행 기능 내에서 코드 만 사용할 수 있습니다. 이를 통해 JavaScript 코드의 다른 블록에서 변수의 이름이 어떻게 명명되는지에 대한 우려없이 코드를 작성할 수 있습니다.

예를 들어:

(function(){ 
    var foo = 3; 
    alert(foo); 
})(); 

alert(foo); 

FOO가 정의되지 않기 때문에 먼저 "3"을 알리고 다음 경고에 오류가 발생합니다.

다른 팁

단순합니다. 매우 정상적인 모습, 거의 편안함 :

var userName = "Sean";

console.log(name());

function name() {
  return userName;
}

하지만. 고급 문자를 기본 레벨 표현으로 변환하는 매우 편리한 JavaScript 라이브러리를 내 페이지에 포함 시키면 어떻게됩니까?

무엇을 기다립니다?

내말은. 누군가가 어떤 종류의 악센트로 캐릭터를 입력 한 경우 (예 : 프랑스어 또는 스페인어 캐릭터와 같은) '영어'캐릭터 만 원하십니까? 내 프로그램에서 AZ? 글쎄 ... 스페인어 'n ~'와 프랑스어 'e/'캐릭터 (나는 각각 두 캐릭터를 사용했지만 악센트를 나타내는 캐릭터로 정신적으로 도약 할 수 있습니다), 해당 캐릭터는 번역 될 수 있습니다. 'n'과 'e'의 기본 문자로.

그래서 좋은 사람이 내 사이트에 포함시킬 수있는 포괄적 인 캐릭터 컨버터를 작성했습니다.

한 가지 문제 : 내 함수와 동일한 '이름'이라는 기능이 있습니다.

이것이 충돌이라고합니다. 우리는 두 가지 기능을 동일하게 선언했습니다 범위 같은 이름으로. 우리는 이것을 피하고 싶습니다.

그래서 우리는 어떻게 든 코드를 범위로 삼아야합니다.

JavaScript에서 코드를 범위로하는 유일한 방법은 기능으로 래핑하는 것입니다.

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

그것은 우리의 문제를 해결할 수 있습니다. 이제 모든 것이 밀폐되어 있으며 개구부 및 닫는 버팀대 내에서만 액세스 할 수 있습니다.

우리는 함수에 함수가 있습니다 ... 보는 것이 이상하지만 완전히 합법적입니다.

단 하나의 문제. 우리 코드는 작동하지 않습니다. 우리의 사용자 이름 변수는 콘솔에 반영되지 않습니다!

기존 코드 블록 후 기능에 호출을 추가 하여이 문제를 해결할 수 있습니다 ...

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

main();

또는 전에!

main();

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

이차적 인 관심사 : '메인'이라는 이름이 아직 사용되지 않은 기회는 무엇입니까? ... 너무 날씬합니다.

더 많은 범위가 필요합니다. Main () 함수를 자동으로 실행하는 방법.

이제 우리는 자동 실행 기능 (또는 자체 실행, 자기 운영 등)에옵니다.

((){})();

구문은 죄처럼 어색합니다. 그러나 작동합니다.

함수 정의를 괄호 안에 래핑하고 매개 변수 목록 (다른 세트 또는 괄호!)을 포함시킬 때 함수 역할을합니다. 전화.

자체 실행 구문으로 코드를 다시 살펴 보겠습니다.

(function main() {
  var userName = "Sean";

    console.log(name());

    function name() {
      return userName;
    }
  }
)();

따라서 읽은 대부분의 튜토리얼에서는 이제 '익명 자체 실행'이라는 용어 또는 유사한 용어로 폭격을 일으킬 것입니다.

수년간의 전문성 개발 후, i 강하게 이름을 촉구합니다 당신이 쓴 모든 기능 디버깅 목적.

뭔가 잘못되면 (그리고 그것은) 브라우저에서 뒤로를 확인하게됩니다. 그것은이다 언제나 스택 추적의 항목에 이름이있을 때 코드 문제를 좁힐 수 있습니다!

대단히 바람이 불고 도움이되기를 바랍니다!

자체-보정 (자동 인상으로도 알려짐)은 함수가 해당 정의에 즉시 실행될 때입니다. 이것은 핵심 패턴이며 다른 많은 패턴의 JavaScript 개발의 기초 역할을합니다.

나는 훌륭한 팬입니다 :)

  • 코드를 최소로 유지합니다
  • 프레젠테이션에서 행동의 분리를 시행합니다
  • 그것은 명명 충돌을 방지하는 폐쇄를 제공합니다

엄청나게 - (왜 좋은 말을해야합니까?)

  • 한 번에 함수를 정의하고 실행하는 것입니다.
  • 자체 실행 함수가 값을 반환하고 함수를 다른 함수로 전달할 수 있습니다.
  • 캡슐화에 좋습니다.
  • 블록 스코핑에도 좋습니다.
  • 예, 모든 .js 파일을 자체 실행 기능으로 동봉하고 글로벌 네임 스페이스 오염을 방지 할 수 있습니다. ;)

여기.

네임 스페이스. JavaScript의 스코프는 기능 수준입니다.

묵시적인 전역 변수에 대한 답변 중 어느 것도 언급되지 않았다는 것을 믿을 수 없습니다.

그만큼 (function(){})() 구문은 나에게 더 큰 관심사인 암시적 전역 변수로부터 보호하지 않습니다. http://yuiblog.com/blog/2006/06/01/global-domination/

기본적으로 함수 블록은 정의한 모든 종속 "전역 변수"가 프로그램에 국한되어 있는지 확인하며 암시적 전역 정의로부터 사용자를 보호하지 않습니다. JSHint 등은 이러한 행동을 방어하는 방법에 대한 권장 사항을 제공할 수 있습니다.

간결할수록 var App = {} 구문은 유사한 수준의 보호를 제공하며 '공개' 페이지에 있을 때 함수 블록에 래핑될 수 있습니다.(보다 Ember.js 또는 새싹코어 이 구성을 사용하는 라이브러리의 실제 예를 보려면)

private 속성은 공용 프레임워크나 라이브러리를 만들지 않는 한 다소 과대평가되지만 구현해야 하는 경우에는 더글라스 크록포드 좋은 아이디어가 있어요.

매개 변수가 있고 "많은 코드"가 함수를 반환합니까?

var a = function(x) { return function() { document.write(x); } }(something);

폐쇄. 의 가치 something 할당 된 함수에 의해 사용됩니다 a. something 약간의 값 (루프)을 가질 수 있으며 매번 A는 새로운 기능을 가질 수 있습니다.

나는 모든 답을 읽었습니다. 여기에서 매우 중요한 것이 빠져 있습니다, 나는 키스 할 것이다. 자기 실행 익명 기능이 필요한 이유는 두 가지 주요 이유가 있습니다.즉시 침입 된 기능 표현 (IIFE)":

  1. 더 나은 네임 스페이스 관리 (네임 스페이스 오염 방지 -> JS 모듈)
  2. 클로저 (OOP에서 알려진 개인 클래스 멤버 시뮬레이션)

첫 번째는 매우 잘 설명되었습니다. 두 번째는 다음 예를 연구하십시오.

var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());

주의 1 : : : : 우리는 기능을 할당하지 않습니다 MyClosureObject, 뿐만 아니라 그 기능을 호출 한 결과. 알고 있어야합니다 () 마지막 줄에서.

Attention 2: JavaScript의 기능에 대해 추가로 알아야 할 것은 내부 기능이 얻는다는 것입니다. 매개 변수 및 변수에 대한 액세스 함수의 내부에 정의됩니다.

몇 가지 실험을 시도해 봅시다.

나는 얻을 수있다 MyName 사용 getMyName 그리고 그것은 작동합니다 :

 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP

다음과 같은 독창적 인 접근 방식은 작동하지 않습니다.

console.log(MyClosureObject.MyName); 
// undefined

그러나 다른 이름을 설정하고 예상 결과를 얻을 수 있습니다.

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP

편집하다: 위의 예에서 MyClosureObject 없이 사용하도록 설계되었습니다 new접두사, 따라서 협약별로는 대문자가되어서는 안됩니다.

범위 격리. 함수 선언 내부의 변수가 외부 네임 스페이스를 오염시키지 않도록합니다.

물론 JS 구현의 절반에서 어쨌든 그들은 어쨌든 할 것입니다.

다음은 익명의 자체 호출 기능이 어떻게 유용 할 수 있는지에 대한 확실한 예입니다.

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

산출: 10, 10, 10, 10, 10...

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

산출: 0, 1, 2, 3, 4...

한 가지 차이점은 함수에서 선언하는 변수가 로컬이므로 함수를 종료 할 때 사라지고 다른 코드의 다른 변수와 충돌하지 않습니다.

자바 스크립트에서 자체 호출 기능 :

자체 침입 표현은 부름받지 않고 자동으로 (시작) 호출됩니다. 자체 침입 표현은 생성 된 직후에 호출됩니다. 이것은 기본적으로 명명 충돌을 피하고 캡슐화를 달성하는 데 사용됩니다. 이 함수 외부에서는 변수 또는 선언 된 객체에 액세스 할 수 없습니다. 최소화 문제를 피하기 위해 (filename.min)는 항상 자체 실행 기능을 사용하십시오.

JavaScript의 함수는 일류 객체이므로이를 정의함으로써 C ++ 또는 C#과 유사한 "클래스"를 효과적으로 정의합니다.

이 함수는 로컬 변수를 정의하고 그 안에 함수를 가질 수 있습니다. 내부 함수 (효과적으로 인스턴스 방법)는 로컬 변수 (효과적으로 인스턴스 변수)에 액세스 할 수 있지만 나머지 스크립트에서 격리됩니다.

자체 실행 기능은 변수의 범위를 관리하는 데 사용됩니다.

변수의 범위는 프로그램의 영역입니다.

글로벌 변수는 글로벌 범위를 가지고 있습니다. JavaScript 코드의 어느 곳에서나 정의되며 스크립트 내 어디에서나 함수의 경우에도 액세스 할 수 있습니다. 반면에 함수 내에서 선언 된 변수는 함수 본문 내에서만 정의됩니다. 그들은 로컬 변수이며 로컬 범위를 가지고 있으며 해당 기능 내에서만 액세스 할 수 있습니다. 함수 매개 변수는 또한 로컬 변수로 계산되며 함수의 본문 내에서만 정의됩니다.

아래에 표시된 것처럼 함수 내부의 GlobalVariable 변수에 액세스 할 수 있으며 함수 본문 내에서 로컬 변수가 동일한 이름의 글로벌 변수보다 우선합니다.

var globalvar = "globalvar"; // this var can be accessed anywhere within the script

function scope() {
    alert(globalvar);
    localvar = "localvar" //can only be accessed within the function scope
}

scope(); 

따라서 기본적으로 자체 실행 함수를 사용하면 JavaScript 코드의 다른 블록에서 변수가 어떻게 명명되는지에 대한 우려없이 코드를 작성할 수 있습니다.

이 질문이 준비된 것처럼 보이지만 어쨌든 내 입력을 게시하겠습니다.

나는 언제 자기 집행 기능을 사용하는 것을 알고 있습니다.

var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}

이 기능을 통해 일부 추가 코드를 사용하여 일반적으로 사용되는 변수를 설정하거나 수학 방정식을 실행하는 등 청정 코드의 childobjects 속성 및 속성을 정의 할 수 있습니다. 오! 또는 오류 확인. 중첩 된 객체 인스턴스틱 구문으로 제한되는 것과는 달리 ...

object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}

일반적으로 코딩하는 것은 똑같은 일을 많이하는 많은 모호한 방법을 가지고 있으며, "왜 귀찮게합니까?" 그러나 더 이상 기본/핵심 원칙에만 의존 할 수없는 새로운 상황이 계속 나타납니다.

(function(){
    var foo = {
        name: 'bob'
    };
    console.log(foo.name); // bob
})();
console.log(foo.name); // Reference error

실제로 위의 함수는 이름이없는 함수 표현식으로 취급됩니다.

근접 및 열린 괄호로 기능을 감싸는 주요 목적은 전 세계 공간을 오염시키는 것을 피하는 것입니다.

함수 표현식 내부의 변수와 함수는 개인이되었습니다 (즉,) 함수 외부에서 사용할 수 없습니다.

IIRC를 사용하면 개인 속성과 방법을 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top