클로저_closure
외부함수, 내부함수
function outter(){
var title = 'coding everybody';
function inner(){
alert(title);
}
inner();
}
outter();
정의
- 외부함수가 종료되었음에도 불구하고 내부함수 내의 변수값을 외부함수에서 가져온다
function outter(){
var title = 'coding everybody';
return function(){
alert(title);
}
}
inner = outter();
inner();
private variable
function factory_movie(title){
return {
get_title : function (){
return title;
},
set_title : function(_title){
title = _title
}
}
}
ghost = factory_movie('Ghost in the shell');
matrix = factory_movie('Matrix');
alert(ghost.get_title());
alert(matrix.get_title());
ghost.set_title('공각기동대');
alert(ghost.get_title());
alert(matrix.get_title());
응용
var arr = []
for(var i = 0; i < 5; i++){
arr[i] = function(){
return i;
}
}
for(var index in arr) {
console.log(arr[index]());
}
var arr = []
for(var i = 0; i < 5; i++){
arr[i] = function(id) {
return function(){
return id;
}
}(i);
}
for(var index in arr) {
console.log(arr[index]());
}
]var arr = []
for(var i = 0; i < 5; i++){
arr[i] = function(id) {
return id
}(i);
}
for(var index in arr) {
console.log(arr[index]);
}
arguments
정의
- 배열과 유사하지만 객체로 정의한다
- func(arg) 정의하고 func(10) 실행한다면
arg 매개변수(parameter)라 칭하고, 10 인자라고 칭한다
function sum(){
var i, _sum = 0;
for(i = 0; i < arguments.length; i++){
document.write(i+' : '+arguments[i]+'<br />');
_sum += arguments[i];
}
return _sum;
}
document.write('result : ' + sum(1,2,3,4));
function length
function zero(){
console.log(
'zero.length', zero.length,
'arguments', arguments.length
);
}
function one(arg1){
console.log(
'one.length', one.length,
'arguments', arguments.length
);
}
function two(arg1, arg2){
console.log(
'two.length', two.length,
'arguments', arguments.length
);
}
zero();
one('val1', 'val2');
two('val1');
함수의 호출
apply 기본
function sum(arg1, arg2){
return arg1+arg2;
}
alert(sum(1,2));
alert(sum.apply(null, [1,2]));
apply 심화
o1 = {val1:1, val2:2, val3:3}
o2 = {v1:10, v2:50, v3:100, v4:25}
function sum(){
var _sum = 0;
for(name in this){
_sum += this[name];
}
return _sum;
}
alert(sum.apply(o1))
alert(sum.apply(o2))
function sum(){
var _sum = 0;
for(name in this){
if(typeof this[name] !== 'function')
_sum += this[name];
}
return _sum;
};
o1 = {val1:1, val2:2, val3:3, val4:sum};
o2 = {v1:10, v2:50, v3:100, v4:25, v5:sum};
alert(o1.val4());
alert(o2.v5());