함수에서 국부 변수 대상의 모든 키 값을 가져올까요?

4639 단어 면접 문제

제목.


다음 코드를 바꾸지 않은 상황에서 함수fn의 국부 변수obj의 모든 키 값을 어떻게 얻습니까?
function fn (key) {
  const obj = { a: 1, b: 2, /* other props */ }
  return obj[key];
}

분석하다.


이를 통해 알 수 있듯이obj는 특정한 키를 호출하여 그 값을 얻고,this 상하문의 원리에 따라obj를 통해 특정한 함수를 호출하면,this는obj의 대상을 직접 획득하고Object.keys(this)obj의 모든 키 값을 얻을 수 있다.
제목에서 키만 통해 이 속성의 값을 얻을 뿐 함수를 호출하지 않았다.그러면 여기에는 Object.defineProperty를 통해obj의 어떤 속성을 납치한 get을 생각해야 한다. 그리고return Object.keys(this)는 다음과 같다.
var obj = {a: 1, b: 2};
Object.defineProperty(obj, 'somekey', {
  get () { return Object.keys(this) }
});
obj.somekey // ['a', 'b']

그러나 제목의 요구에 따라 우리가obj를 직접 납치할 수 있다면 여기에는 원형 체인의 원리를 이용해야 한다.obj에 'somekey'가 없다고 가정하면 원형 체인에서 이 속성을 찾습니다. 즉Object.prototype에서 이 속성을 찾습니다.그럼 우리는 직접 납치Object.prototype'somekey'을 할 수 있다.
문제는 이것'somekey'이 obj에 존재하지 않는다는 것을 어떻게 보증하는가?-Symbol !

해답하다

let key = Symbol();
Object.defineProperty(Object.prototype, key, {
  get () { return Object.keys(this) }
});

fn(key); // ['a', 'b', /* other props */]

외국 편


물론 함수 내용의 문자열을 fn.toString 를 통해 얻은 다음 정규를 통해 일치하는 소작업도 있다.

좋은 웹페이지 즐겨찾기