상세 컨텐츠

본문 제목

[자바스크립트] thisArg. 펑션에 this를 넣기

카테고리 없음

by esoesmio 2023. 5. 16. 17:44

본문

옷찾아가는 문제

 

 

 

function recommendForYou (me) {
    const products = [
        { sex: 'F', size: 'M' },
        { sex: 'M', size: 'L' },
        { sex: 'F', size: 'M' },
        { sex: 'U', size: 'S' },
        { sex: 'M', size: 'L' },
        { sex: 'F', size: 'S' },
    ];

    products
        .map((itm, idx) => {
            return { ...itm, idx }
        })

        // ⚠️ 화살표 함수 대신 function 선언 함수 사용 주목
        .filter(function ({sex, size}) {
            return ['U', this.sex].includes(sex)
                && size === this.size
        }, me) // 💡 thisArg

        .forEach(function ({idx}) {
            console.log(`${this.name}님, ${++idx}번은 어떠세요?`);
        }, me); // 💡 thisArg
}

const peter = {
    name: '피터',
    sex: 'M',
    size: 'L'
};

const jane = {
    name: '제인',
    sex: 'F',
    size: 'S'
};

recommendForYou(peter);
recommendForYou(jane);
이 코드에서 size === this.size 부분은 Array.prototype.filter 메소드의 콜백 함수에서 사용되고 있습니다. 이 콜백 함수는 각 배열 요소를 순회하며 호출되며, 각 요소는 products 배열의 개별 아이템입니다.

따라서, size는 products 배열의 각 아이템에서 가져온 속성입니다. 즉, 각 제품의 사이즈를 나타냅니다.

this.size는 filter 메소드의 두 번째 인자, 즉 thisArg에서 가져온 것입니다. 이 thisArg는 함수의 this 컨텍스트를 설정하며, 이 코드에서는 me 객체를 전달하고 있습니다. me 객체는 recommendForYou 함수를 호출할 때 전달되는 인자로, peter나 jane 같은 사용자 정보 객체입니다.

따라서 this.size는 사용자의 사이즈를 나타냅니다.

결론적으로, size === this.size는 각 제품의 사이즈(size)가 사용자의 사이즈(this.size)와 같은지 비교하는 것입니다. 이를 통해 사용자의 사이즈에 맞는 제품만을 필터링하려는 목적이 있습니다.





User
아 그럼 this.size는 me의 사이즈구나?
ChatGPT
네, 맞습니다. this.size는 me 객체의 size 속성을 참조하고 있습니다. filter 함수의 두 번째 인자로 me 객체를 전달하여 this 컨텍스트를 설정했기 때문에, this.size는 me.size와 동일합니다. 이 코드에서 me는 recommendForYou 함수를 호출할 때 전달되는 peter나 jane 객체를 의미합니다. 이들 객체 모두 size 속성을 가지고 있습니다.





User
 return ['U', this.sex].includes(sex)
                && size === this.size 이게 무슨뜻이야? 갑자기 왜 U가 나와?
ChatGPT
이 코드의 의미를 간단히 설명하면, "제품의 성별이 'U'(Unisex, 남녀 공용)이거나 사용자의 성별과 일치하며, 동시에 제품의 사이즈가 사용자의 사이즈와 일치하는 제품을 필터링하겠다"는 것입니다.

자세히 살펴보면, ['U', this.sex].includes(sex)는 제품의 성별(sex)이 'U'(Unisex, 남녀 공용)이거나 사용자의 성별(this.sex)과 일치하는지 확인하는 코드입니다. Array.prototype.includes 메소드는 특정 배열이 특정 요소를 포함하고 있는지 확인합니다. 여기서는 'U' 또는 사용자의 성별이 제품의 성별과 일치하는지를 확인합니다.

그리고 size === this.size는 제품의 사이즈(size)가 사용자의 사이즈(this.size)와 일치하는지 확인하는 코드입니다.

두 조건을 모두 만족하는 제품만을 필터링하기 위해 두 조건문 사이에 && (논리 AND 연산자)가 사용되었습니다. 즉, 성별이 일치하거나 성별이 'U'이며, 사이즈가 일치하는 제품만을 반환합니다. 이를 통해 사용자에게 가장 적합한 제품을 추천하려는 목적이 있습니다.





User
Array.prototype.includes 이것의 예를 많이 보여줘
ChatGPT
Array.prototype.includes 메소드는 배열에 특정 요소가 포함되어 있는지 확인하는데 사용됩니다. 이 메소드는 boolean 값을 반환합니다: 요소가 배열에 있으면 true, 그렇지 않으면 false를 반환합니다.

다음은 Array.prototype.includes 메소드의 간단한 사용 예시입니다:

기본적인 사용법:
javascript
Copy code
let arr = [1, 2, 3, 4, 5];

console.log(arr.includes(2)); // true
console.log(arr.includes(6)); // false
문자열에 대한 사용:
javascript
Copy code
let fruits = ['apple', 'banana', 'mango', 'grape'];

console.log(fruits.includes('banana')); // true
console.log(fruits.includes('pineapple')); // false
배열의 특정 인덱스부터 검색 시작:
javascript
Copy code
let arr = [1, 2, 3, 4, 5];

console.log(arr.includes(2, 2)); // false - 인덱스 2부터 시작하므로 2를 포함하지 않음
console.log(arr.includes(4, 2)); // true - 인덱스 2부터 시작하므로 4를 포함함
NaN의 경우:
javascript
Copy code
let arr = [NaN];

console.log(arr.includes(NaN)); // true - includes는 NaN도 정확히 확인할 수 있습니다.
이 메소드는 배열 내에 특정 요소가 존재하는지 확인하는 경우에 매우 유용합니다.





User

        // ⚠️ 화살표 함수 대신 function 선언 함수 사용 주목
        .filter(function ({sex, size}) {
            return ['U', this.sex].includes(sex)
                && size === this.size
        }, me) // 💡 thisArg

        .forEach(function ({idx}) {
            console.log(`${this.name}님, ${++idx}번은 어떠세요?`);
        }, me);  여기서 다 , me 이렇게 인자로 me가 들어가는데 왜이러는거야? 저 함수들이 인자를 뭘로 받아야하길래 항상 Me가 들어가?
ChatGPT
이 코드에서 filter와 forEach 메소드에 me를 두 번째 인자로 전달하는 이유는 this 컨텍스트를 설정하기 위함입니다. JavaScript에서 함수의 this는 기본적으로 그 함수가 어떻게 호출되었는지에 따라 결정됩니다. 하지만 filter와 forEach와 같은 배열 메소드에서 콜백 함수의 this는 기본적으로 undefined입니다.

따라서 this를 특정 객체로 바인딩하려면 몇 가지 방법을 사용할 수 있습니다. 하나는 Function.prototype.bind 메소드를 사용하는 것이고, 다른 하나는 filter와 forEach와 같은 메소드가 제공하는 thisArg 파라미터를 사용하는 것입니다.

thisArg 파라미터를 사용하면 해당 메소드의 콜백 함수 내에서 this가 가리키는 객체를 지정할 수 있습니다. 이 코드에서는 me 객체를 thisArg로 전달하여, 콜백 함수 내에서 this가 me 객체를 가리키도록 설정하였습니다. 이렇게 하면 콜백 함수 내에서 this.sex, this.size, this.name 등으로 me 객체의 속성에 접근할 수 있습니다.

이런 방식은 콜백 함수 내에서 특정 객체의 메소드나 속성에 접근해야 할 때 유용합니다. 이 코드에서는 me 객체의 sex, size, name 속성을 콜백 함수 내에서 사용하고 있기 때문에 thisArg 파라미터로 me를 전달하는 것입니다.





User
아니 foreach 문에 왜 인자가 두가개 들어가냐고,
ChatGPT
JavaScript의 Array.prototype.forEach() 메소드는 최대 2개의 인자를 받을 수 있습니다:

콜백 함수: 배열의 각 요소에 대해 실행할 함수입니다.
thisArg (선택 사항): 콜백 함수에서 사용할 this 값입니다.
forEach()에서 두 번째 인자 thisArg는 선택적입니다. 이 인자를 제공하면 콜백 함수 내부의 this 값이 thisArg 값으로 설정됩니다.

이 경우, 콜백 함수 내에서 this를 사용해 me 객체의 속성에 접근하려고 하기 때문에, thisArg로 me 객체를 전달하고 있습니다. 그래서 forEach에 두 개의 인자가 들어가는 것입니다.

다시 말해, 이 코드에서 forEach 함수에 두 번째 인자로 me가 들어가는 이유는, 콜백 함수 내부에서 this를 me 객체로 설정하려는 것입니다. 이렇게 하면, 콜백 함수 내부에서 this.name을 통해 me 객체의 name 속성에 접근할 수 있습니다.

댓글 영역