JAVASCRIPT

[자바스크립트] bind()

wooodii 2022. 9. 19. 15:44

새로운 함수를 생성하고, 받게 되는 첫 인자의 value로 this키워드를 설정. (함수를 객체에 결합하는 것)

bind()에 전달하는 인자 중 첫번재를 제외한 나머지는 this 값과 함께 결합됨 (부분 적용) 

 

 1) thisArg : 바인딩 함수가 대상 함수의 this에 전달되는 값 

 2) arg1, 2 : 대상 함수의 인수 앞에 사용될 인수 

func.bind(thisArg[,arg1[,arg2 [,....] ]])
function f(y) {return this.x + y; } // 결합할 함수 
let o = {x:1}; // 결합될 객체
let g = f.bind(o); // g(x)를 호출하면 o에서 f()를 호출합니다. 
g(2) // 3
let p = {x:10, g}; // g()를 객체의 메서드로 호출 
p.g(2) // 3 : g는 여전히 o에 결합되지 않습니다.

 

1) 바인딩된 함수 생성 

호출 방법과 관계없이 특정 this 값으로 호출되는 함수를 만듦 

객체로부터 메소드를 추출하고, 함수를 호출할 때 원본 객체가 함수의 this로 사용될 것이라 기대함 

그러나, 원본 객체는 손실되기 때문에 바인딩(bind)함수를 사용하면 해결 가능 

this.x = 9;
var module = {
	x :81; 
    getX : function() {return this.x;}
    };
    
    module.getX(); // 81
    
 var retrieveX = module.getX;
 retrieveX(); // 9 반환 : 함수가 전역 스코프에서 호출됨 
 
 // module과 바인딩 된 this가 있는 새로운 함수 생성 
 var boundGetX = retreieveX.bind(moudle);
 boundGetX();

2) 부분 적용함수 

미리 지정된 초기 인수가 있는 함수를 만듦 

초기 인수가 있으면 this 값을 따르고, 바인딩 된 함수에 전달되어서 바인딩된 함수가 호출될 때마다 대상 함수인수 앞에 호출 

function list() {
	return Array.prototype.slice.call(arguments);
    }
    
    var list1 =list(1,2,3); // 배열 생성 
    
    //선행될 인수를 설정해 함수를 생성 
    var ladingThirtysevenList = list.bind(null, 37);
    
    var list2 = leadingThirtysevenList(); // [37]
    
    var list3 = leadingThirtysevenList(1,2,3); // [37, 1, 2, 3]
    
      
      
      
      function addArguments(arg1, arg2) {
        return arg1 + arg2
    }

    var result1 = addArguments(1, 2); // 3

    // 첫 번째 인수를 지정하여 함수를 생성합니다.
    var addThirtySeven = addArguments.bind(null, 37);

    var result2 = addThirtySeven(5); // 37 + 5 = 42

    // 두 번째 인수는 무시됩니다.
    var result3 = addThirtySeven(5, 10); // 37 + 5 = 42

3) setTimeout

window내에서 기본으로 제공되는 객체

function LateBloomer() {
  this.petalCount = Math.ceil(Math.random() * 12) + 1;
}

// 1초 지체 후 bloom 선언
LateBloomer.prototype.bloom = function() {
  window.setTimeout(this.declare.bind(this), 1000);
};

LateBloomer.prototype.declare = function() {
  console.log('I am a beautiful flower with ' +
    this.petalCount + ' petals!');
};

var flower = new LateBloomer();
flower.bloom();
// 1초 뒤, 'declare' 메소드 유발

 

 

 

참고자료 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

728x90