myFunc()
o.method()
Function Person(){
this.name = 'abc'
}
const p = new Person()
function.call(null, a)
function callback(){
console.log('xxx')
}
function myFunc(name, callback()){
console.log('name :' , name)
callback(name)
}
myFunc('Daniel', callback)
setTimeout(function(){...})
function myFunc(){
console.log('myFunc called')
}
// 1. 함수 직접 호출
myFunc()
const o ={
name : 'Daniel',
printName : function(){
console.log(this.name)
}
}
// 2. 객체의 함수를 호출 => 이때 this값이 객체를 가르킴
o.printName()
function Person(name){
this.name = name
this.printName = function(){
console.log(this.name)
}
}
// 3. 생성자 호출
const p = new Person('Daniel')
// 4. 간접 호출
setTimeout(p.printName.bind(p), 1000)
bind()
이다.let o = {
name : "Daniel",
f1 : () => {
console.log("[f1] this : ", this);
},
f2 : function(){
console.log("[f2] this : ", this);
},
};
o.f1(); // global
o.f2(); // o
setTimeout(o.f1, 10); // global
setTimeout(o.f2, 10); // global
let o = {
name : "Daniel",
printNAme : function(){
console.log("내 이름은 ", this.name);
},
};
o.printName(); // 내 이름은 Daniel
setTimeout(o.printName, 10); // 내 이름은 Undefined
setTimeout(o.printName.bind(o), 20); // 내 이름은 Daniel
setTimeout()
메서드 안에 들어오면 this가 없기 때문에 undefined가 나온다. 이에 this를 변경해줄 수 있는 것이 바로 bind()
이다.const o = {
method(){
console.log("context :", this) // o
let f1 = function(){
console.log("[f1] this :", this)
}
let f2 = () =>
console.log("[f2] this :", this)
f1() // global
f2() // o
},
};
o.method()
global
을 가리킨다. 이때 만약 use strict
mode를 쓰게 된다면 undefined
를 가르킬것이다.window.name = 'Daniel'
let o = {name : 'Kim'}
let arrowFunction = (prefix) => console.log(prefix + this.name)
arrowFunction('Dr. ') // Dr. Daniel
arrowFunction.bind(o)('Dr. ') // Dr. Daniel
arrowFunction.call(o, 'Dr. ') // Dr. Daniel
arrowFunction.apply(o, ['Dr. ']) // Dr. Daniel
const button = document.querySelector('button');
function clickHandler(message) {
console.log('Clicked ' + message + ' by ' + this.name);
}
const user = {
name: 'John'
};
if (button) {
button.addEventListener('click', clickHandler.bind(user, '안녕'));
}
const button = document.querySelector('button');
function clickHandler(message) {
console.log('Clicked ' + message);
}
if (button) {
button.addEventListener('click', () => clickHandler('안녕'));
}
bind 메서드와 화살표 함수는 함수를 다른 방식으로 호출하고
함수 컨텍스트
를 설정하는 데 사용될 수 있다.
그러나 두 가지 접근 방식은 기능적으로 다르다.
this
)를 앞쪽에 고정시키고, 나중에 호출될 때 전달되는 인자와 함께 실행되도록 한다.function sayName() {
console.log('My name is ' + this.name);
}
const person = {
name: 'John'
};
const boundSayName = sayName.bind(person);
boundSayName(); // 출력: "My name is John"
반면에 화살표 함수는 자체적인 컨텍스트를 갖지 않으며, 화살표 함수 내부에서 this는 상위 스코프의 this 값을 상속받는다.
화살표 함수는 렉시컬 스코프를 사용하므로, 함수를 정의한 시점에서의 외부 스코프의 this 값을 사용한다.
따라서, bind 메서드를 사용하여 함수에 인자를 전달하고 컨텍스트를 설정하는 것은 함수의 동작 방식을 변경시키는 것이다.
반면에 화살표 함수를 사용하여 이벤트 리스너 콜백으로 전달하는 것은 함수의 실행 컨텍스트를 상위 스코프로부터 상속받는 것이다.