[javascript] apply(), call() ⭐⭐ / arguments / bind()
by mini_min[javascript] apply(), call() ⭐⭐ / arguments / bind()
✔️ apply()
: 주어진 this 값과 배열로 제공되는 arguments 로 함수를 호출한다.
📓 형식
: fun.apply(thisArg, [argsArray])
: thisArg : fun 을 호출하는데 제공될 this 의 값이다. 메소드가 비엄격 모드 코드 내의 함수일 경우 null과 undefined 는 전역 객체로 대체된다.
: argsArray : fun 이 호출되어야 하는 인수를 지정하는 유사 배열 객체. 함수에 제공된 인수가 없을 경우 null 또는 undefined
var sum = function(a, b, c) {
return a+b+c;
}
// 1) 일반적인 방법으로 함수 호출
s = sum(1,2,3);
console.log(s);
1) apply() 함수를 이용하여 sum() 함수를 호출
s = sum.apply(null, [ 1, 2, 3 ]); // apply는 함수에 전달할 인자를 배열로 넘긴다.
console.log(s);
💡 결과 : 6
apply는 함수에 전달할 인자를 배열로 넘긴다. [] 속에 넣어서
✔️ call()
: 주어진 this 값 및 각각 전달된 인수와 함께 함수를 호출한다.
: apply 와 유사하며, 차이점은 call()은 함수에 전달될 인수 리스트를 받는데, apply() 는 인수 배열 하나를 받는다는 점!
2) call() 함수를 이용하여 sum() 함수를 호출
s = sum.call(null, 1,2,3); // 함수에 전달할 인자는 함수와 동일하게 넘긴다.
console.log(s);
🔒 최대값 구하기
배열로 넘겨야 최대값 비교가 가능할 때, apply 사용하면 된다!
var nn = [5,6,2,3,7];
//s = Math.max(nn); // NaN
//s = Math.max(5,6,2,3,7); // 7 저렇게 넘겨야 max 가 나옴
console.log(s);
//apply 는 배열값 인자로 주니까 apply 로!
s = Math.max.apply(null, nn); //7
console.log(s);
s = Math.min.apply(null, nn); //2
console.log(s);
🔒 예시
배열로 넘겨야 최대값
//객체
var obj = {
name : '자바',
sayName : function() {
console.log(this.name);
}
};
var obj2 = {
name : '스프링'
};
obj.sayName(); // 자바
obj.sayName.call(null); // this 가 null 이된 것. 출력안함
obj.sayName.call(obj); // 자바
obj.sayName.call(obj2); // 스프링. obj 의 sayname 인데 obj2 를 this 로주니까 스프링이 나옴
💡 obj.sayName.call(null); : sayName 의 this 인자를 null 값을 준 것이다. 그래서 출력안함
obj.sayName.call(obj2); // 스프링. obj 의 sayname 인데 obj2 를 this 로주니까 스프링이 나옴
✔️ arguments
: 자바스크립트 arguments 프로퍼티는 함수를 호출할 때 전달된 인자 값을 나타낸다.
function sub() {
//arguments 는 배열과 유사하게 인덱스로 접근 가능하지만 배열은 아니다.
//즉, 배열을 다루는 메소드는 없다. (소트 조인 등..)
for(let i=0; i<arguments.length; i++){
console.log(arguments[i]);
}
}
sub(1, '자바', true);
💡 arguments 는 배열과 유사하게 인덱스 접근은 되지만, 배열은 아니다. 소트 조인 같은걸 사용 못한다.
✔️ apply 를 써야하는 이유 - 2차원 배열
: 배열에 배열을 추가하면 어떻게 될까? 배열1과 배열2의 값을 합치고 싶은데, 배열에 배열을 추가하면 2차원 배열이 된다. 이런 일이 없도록 apply 를 써야한다.
var aa = ['a' , 'b'];
var bb = [1,2,3];
aa.push(bb);
console.log(aa.join());
- apply 사용하기
let aa1 = ['a' , 'b'];
let bb1 = [1,2,3];
aa1.push.apply(aa1, bb1); // this 는 aa 이고, 인자는 bb
console.log(aa1.length); // 5
console.log(aa1.join());
✔️ bind()
: 호출될 때 this 를 제공된 값으로 설정하는 새로운 함수를 만든다.
var obj = {
name: '자바',
sayName:function(){
console.log(this.name);
}
};
var obj2 = {
name : '스프링'
};
var fun = obj.sayName.bind(obj2); // 함수를 호출하지 않으며 this 가 obj에서 obj2로 변경
fun(); // 스프링
💡 bind() 는 this 를 인자로 넘긴 값으로 설정하는 새로운 함수를 만든다.
: 실행은 따로 시켜줘야함 call 과 다르다. (fun(); )
'JavaScript' 카테고리의 다른 글
[javascript] 브라우저 객체 모델 / window 객체 / document 객체 (0) | 2022.09.21 |
---|---|
[javascript] JSON 객체 (0) | 2022.09.21 |
[javascript] Set 객체 (+배열로 반환) / Map 객체 (0) | 2022.09.21 |
[javascript] 배열 정렬 / forEach() / map() / filter() (1) | 2022.09.21 |
[javascript] 배열 관련 메소드 - indexOf(), join(),reverse() (0) | 2022.09.21 |
블로그의 정보
개발자 미니민의 개발로그
mini_min