2014-01-30 3 views
26

내가 여부 :포장 컨트롤러

(function() { 
'use strict'; 

// Create the module and define its dependencies. 
var app = angular.module('app', [ 
    // Angular modules 
    'ngAnimate',  // animations 
    'ngRoute'   // routing 

    // Custom modules 

    // 3rd Party Modules 

]); 

// Execute bootstrapping code and any dependencies. 
app.run(['$log', 
    function ($log) { 
     $log.log('we are loaded'); 
    }]); 
})(); 

또는

'use strict'; 

// Create the module and define its dependencies. 
var app = angular.module('app', [ 
    // Angular modules 
    'ngAnimate',  // animations 
    'ngRoute'   // routing 

    // Custom modules 

    // 3rd Party Modules 

]); 

// Execute bootstrapping code and any dependencies. 
app.run(['$log', 
    function ($log) { 
     $log.log('we are loaded'); 
    }]); 

모두 작동하는 것 -의 차이는 무엇인가?

익명의 기능에 대해 설명해 주시면 감사하겠습니다. 하나를 사용할 때, 그리고 AngularJ에 대해 양방향으로 작성된 컨트롤러를 보는 이유는 무엇입니까?

감사합니다.

답변

34

둘 다 작동합니다. 익명 함수로 묶은 많은 JavaScript 코드를 발견하게되는 이유는 페이지의 다른 코드에서이 JavaScript 코드를 분리하기 위해서입니다.

전역 범위에 name라는 변수 선언합니다 다음 코드 : 해당 코드를 사용하여

var name = "Hello World"; 

는,라는 변수를 사용하려고 시도하는 페이지에서 다른 스크립트는 name 잠재적으로 예상치 못한 값을 얻을 수 스크립트가 "Hello World"으로 선언했기 때문에 "Hello World"입니다.

는 익명 함수에 해당 코드를 포장함으로써, 당신은 name라는 다른 변수와 충돌의 코드를 유지 : 위의 예에서

(function() { 
    var name = "Hello World"; 
})(); 

, name 이제 익명 함수의 범위 내에서만 사용할 수 있습니다 . 이 아니고이 아니므로 페이지의 다른 코드와 충돌 할 수 없습니다.

제공 한 두 번째 코드 조각에서 app은 이제 app이라는 전역 변수를 선언하는 다른 사람이 덮어 쓸 수있는 전역 변수가되었습니다. 익명 함수로 Angular 모듈을 래핑하면 코드가 다른 코드와 충돌하는 것을 방지 할 수 있습니다.

또한 코드를 사용할 수있는 다른 사람들은 전역 범위를 변경하는 것에 대해 걱정할 필요가 없습니다.

+0

이것이 정말로 필요하다고 생각하십니까? JSHint 지침이 이와 같이 설정 되었기 때문에이 작업을 수행하는 것으로 나타났습니다. –

+2

필수는 아니지만 코드가 없으면 정상적으로 작동하지만 좋은 이유가 있습니다. 대답에 설명했듯이 구조체를 분리하는 일에 코드를 래핑하지 않으면 페이지의 다른 코드를 간섭 할 수 있습니다. 프로젝트가 성장함에 따라 문제가 발생하기 시작합니다. JavaScript 사용 경험에 따라 이미 경험했거나 경험하지 않았을 수 있습니다. 그렇다고해서 코드 분리의 문제로 마침내 문제가 발생할 것이라는 확신을 가질 수는 있습니다. :) –

+0

@JesseDunlap이 정말로 그 답을 못 찾았지만, Google이 후원하는 코드 학교의 "shaping up with angularJS"과정에서도 첫 번째 방법을 권장합니다. 그리고 나는 인용한다 : "당신의 자바 스크립트를 클로저로 감싸는 것은 좋은 습관이다." –

3

JavaScript의 로컬 변수는 함수 범위에만 존재합니다! 아래 같은 인생 (즉시-호출 함수 표현식)을 사용하는 경우

그래서 :

(function() { 
    var app = angular.module('app', []); 
})(); 

당신은 함수의 외부에서 모듈에 액세스 할 수 없습니다

(function() { 
    var app = angular.module('app', []); 
})(); 

// will get app is undefined error 
app.run(['$log', function ($log) { 
    $log.log('we are loaded'); 
}]); 

하는 지역 변수를 선언 전역 변수 대신에 좋은 생각입니다. 그러면 앱 변수가 전역 환경에서 액세스 할 수 없습니다.

전역 변수를 선언하면 변수를 어디서든 사용할 수 있으며 다른 자바 스크립트 프로그램과 충돌 할 수 있습니다.