getter에서 반환 된 함수의`this` 키워드 값


15

다음 예 에서이 키워드 의 예상치 못한 값을 찾았습니다 .

let x = {
    z : 10 ,
    get func1() {
        return function(v) {
            console.log(this === v);
        }
    }
}


x.func1(x)

의 값 키워드는 객체입니다 X 가 그 객체에서 실행되는 것처럼 내가에만 기대 get 함수 키워드는 호출 객체에 동일 X

이 예는 우리에게 차이점을 보여줍니다

let x = {
    func2() {
        return function(v) {
            console.log(this === v);
        }
    }
}

x.func2()(x);

두 예제 에서 getter 함수 인 func1 과 객체의 메소드 인 func2 가 객체 x 에서 실행 된 다음 반환 된 함수가 실행됩니다. 왜 첫 번째 예에서 값이 아닌 전역 객체가 아닌 객체에 동일 X .


3
정말 흥미로운 질문입니다. 나는이 주름이 전에는 결코 없었습니다.
TJ Crowder

1
" 그것은 그 객체에서 실행되는 것처럼 "-하지만이 되어 바로 해당 개체에서 실행 : x.func1().
베르 기

답변:


13

즉 A의 매우 흥미로운 질문입니다.

속성 액세스 결과 즉시 함수가 호출되기 때문입니다. 따라서 이들은 기본적으로 동일합니다.

let x = {
    get func1() {
        return function(v) {
            console.log(this === v);
        };
    },
    func2(v) {
        console.log(this === v);
    }
};

x.func1(x);
x.func2(x);

두 경우 모두 :

  1. 특성 값을 읽고 함수 참조를 생성합니다.
  2. 이 함수는 동일한 속성 액세스 식의 일부로 실행됩니다.

func1접근 자 속성이고 func2데이터 속성 이라는 사실 은 중요하지 않습니다. 속성을 읽은 결과 값이 어떻게 사용되는지가 중요합니다.


1
전체 표현식이 함수 객체로 평가되어 실행될 것이라고 생각했습니다. 감사합니다
Kirollos Nasr

1
@KirollosNasr 네, 그렇습니다.하지만 식에서 는 함수로 평가되지만 멤버 액세스식이 아닌 (질문에서) 후속 호출의 컨텍스트로 x.func1참조를 유지합니다 . xx.func2()
베르 기

1
@ Bergi-당신이 의미하는 것 같아요 x.func2()(x);?
TJ Crowder

1
예 @TJCrowder, 나는 내부의 표현을 참조 x.func1(x)하고x.func2()(x)
BERGI

1
@ Bergi 그래 까다로운 부분이 있습니다. 그러나 이제 더 명확 해졌습니다. TJ Crowder와 여러분
Kirollos Nasr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.