아주 가끔 세미콜론이 없어서 문제가 되는 일이 생긴다.
2. 함수의 이름을 노출시키는 함수정의 방법
function f1(){
alert('...')
}
f1();
3. 함수의 이름을 노출시키지 않는 함수정의 방법
이 방법을 통하면 정의된 함수를 실행시킬 방법이 없다. 그래서 정의함과 동시에 실행시킨다. 이름이 없으므로 실행은 이때 단 한번만 가능하다.
(function (a) {
alert(a);
}) ('xyz'); // 세미콜론이 꼭 필요한 경우이다
(function (a) {
alert(a);
} ('abc') ); // 세미콜론이 꼭 필요한 경우이다
이처럼 괄호 안에 함수가 정의되어 있으면 괄호 바깥에서는 그 함수의 존재사실을 알지 못한다. 이름을 노출시키지 않기위해 괄호안에 정의한 객체들은 결국은 javascript에서 private class의 역할을 한다.
위의 예에서 함수의 인자를 전달하는데 두가지 방법이 있음을 눈치챘다.
4. 함수인자의 전달 vs 함수이름의 전달
함수인자를 전달하거나
(function ( arg ) {
alert( arg );
} ( 'abc' ) );
함수이름을 전달한다.
(function ( fn ) {
fn( 'abc' );
} ( alert ) );
함수이름 (또는 함수의 포인터)를 전달할때는 괄호를 빼면 된다. 괄호가 포함되면 함수는 실행되어버린다. 위의 예에서는 alert함수의 포인터를 전달하기위해서 alert()에서 괄호를 뺀 alert만 사용했다.
5. 노출되지 않은 변수명을 외부로 노출시키는 방법
(function() {
var age = 20;
(function() {
var age = 20;
var real_age = 30;
} () );
위의 예에서, 외부에 age만 노출시키고싶으면 다음과 같이 한다.
var global = {}; // 1. 이름이 노출되는 방식으로 선언된 객체 global
(function( g ) { // 3. global을 인자로 받고
} (global) ); // 2. global을 인자로 전달하고
6.
var global = {}; // 1. 이름이 노출되는 방식으로 선언된 객체 global
(function( g ) { // 3. global을 인자로 받고
var age = 20;
var real_age = 30;
g.age = age; // 4. 노출시키고싶은 변수를 global의 새 항목으로 등록한다} (global) ); // 2. global을 인자로 전달하고
6.