this

javascript의 this 키워드는 다른 언어와는 조금 다르게 동작한다.

실행컨텍스트(EC, Execution Context)가 생성될때마다 this의 바인딩이 일어나며 우선순위가 있다.

대부분은 함수를 호출한 방법에 의해 this가 결정된다. 따라서 함수의 호출때마다 다를수도 있다.

 

1. new 는 해당객체

2. call, apply, bind 같은 명시적 바인딩일 경우 인자로 전달된 객체

3. 객체의 메소드로 호출한 경우 해당 객체

4. 그외 엄격모드는 undefined로 초기화 됨 (엄격, 비엄격에 차이가 있다)

5. 글로벌에서 일반 브라우저는 window, 노드는 global

 


전역 문맥

전역 실행 문맥에서의 this는 엄격모드 여부에 관계없이 전역 객체를 참조합니다.

// 브라우저 전역 객체는 window
console.log(this === window); // true

 

함수 문맥 

호출한 방법에 의해 this가 결정된다.

같은 코드라도 엄격모드 비엄격모드에서 달라질 수 있다.

// 비엄격모드
function test() {
  return this;
}

test() === window; // true

// 엄격모드
functiontest(){
  "use strict"; 
  return this;
}

test() === undefined; // true

this의 값을 한 문맥에서 다른 문맥으로 넘기려면 call, apply 메서드를 사용할 수 있습니다.

 

 

bind

ECMAScript 5에서는 Function.prototype.bind를 도입

bind는 함수를 어떻게 호출했는지 상관하지 않고 this를 설정할 수 있다.

this는 bind()의 첫 번째 매개변수로 고정.

function test() {
  return this.a;
}

var test1 = f.bind({a: 'azerty'});
console.log(g()); // azerty

var h = g.bind({a: 'yoo'}); // bind는 한 번만 동작함!
console.log(h()); // azerty

var o = {a: 37, f: f, g: g, h: h};
console.log(o.a, o.f(), o.g(), o.h()); // 37, 37, azerty, azerty

 

arrow function

ES6에서는 스스로 this 바인딩을 제공하지 않는 화살표 함수를 추가.

이때는 실행컨텍스트안의 this값을 유지.

const car = {
	name : avante,
	getPrice: function() {
	return this.name;
  },
};

console.log(car.name()); // avante

 

 


 

this의 바인딩

https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/this.md

 

mdn 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/this

 

네이티브 객체(NAtive Objects)

 

자바스크립트 언어 규약(ECMAScript)명세의 정의된 내장 객체이다.

  • native object, built-in object라고 부른다.
  • 전역의 공통 기능을 제공하며 특정 환경(브라우저 등의 클라이언트 프로그램, 또는 Node.js 등의 런타임)에 종속되지 않는다.
  • 네이티브 객체는 모든 내장 객체(built-in object)를 포함하며 내장 네이티브 생성자는 각자의 .prototype객체를 가진다.
  • 프로토타입 객체에는 해당 객체의 하위 타입별로 고유한 로직이 담겨있다.

종류

  • String()
  • Number()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Date()
  • Error()
  • Symbol()

생성자 처럼 사용할 수 있지만 아닌 경우도 있다.

new String('Hello'); 
// string 'Hello'가 아닌 'Hello'를 감싸는 문자열 래퍼를 생성함

 

Object를 type으로 가지고 있는 값의 경우 [[Class]]라는 내부 프로퍼티가 추가로 있는데, 이때 이 프로퍼티를 접근하기 위해서는 Object.prototype.toString() 메서드에 값을 넣어 호출해야한다.

Object.prototype.toString.call([1,2,3]); 
// '[object Array]'

원시값의 경우 null과 undefined는 각각 Null, Undefined로 나타난다.

 

그 밖의 

문자열, 숫자, 불리언 등은 단순 원시값이며 자바스크립트는 원시값을 자동으로 객체 래퍼(Wrapper) 클래스로 박싱하여 오류를 방지한다.

var hello = 'Hello';
// 문자열은 원시값

hello.length; // 5
// 이때 length()로 접근하는데, 오류가 발생하지 않는다.

 

Symbol은 ES6에서 처음 선보인 새로운 원시값 타입이다.

충돌 염려없이 객체 프로퍼티로 사용가능한 특별한 '유일 값'이다.

Symbol은 프로퍼티명으로 사용할 수 있으나 프로그램 코드나 개발자 콘솔 창에서 실제 값을 보거나 접근하는 것은 불가능하다. (함수 객체의 정적 프로퍼티로 접근한다.)

Symbol은 네이티브 생성자이기 때문에 new를 붙이면 에러가 난다.

var hello = Symbol('Hello');

typeof hello // "symbol"

Object.getOwnPropertySymbols(hello); // [ Symbol(hello) ]

 

 

호스트 객체(Host Objects)

 

ECMASrcipt의 실행 환경을 만들기위해 window, XMLHTTPRequest 등 런타임환경(브라우저, Nodejs)에 의해 제공되는 객체를 말한다.

 

 

종류 (ex : 브라우저 환경일때)

ㄴ os, web browser를 실행환경에서 제공하는 호스트 객체라고 할 수 있음

  • window (BOM, browser object model)
    • 모든 객체의 유일한 최상위 객체인 전역객체, 브라우저 탭 또는 브라우저 창의 모델
  • document (DOM, document object model)
    • 현재 웹페이지의 모델
  • location
  • history
  • XMLHttpRequest
  • setTimeout
  • getElementsByTagName
  • querySelectorAll, …

참고

네이티브 객체 VS 호스트 객체
네이티브 객체 
호스트 객체와 네이티브 객체
호스트객체와 네이티브객체

 

실행컨텍스트(Execution Context)

  • 코드의 실행환경에 대한 여러가지 정보를 담고 있는 개념 

    • 자바스크립트 엔진에 의해 만들어지고 사용되는 코드 정보를 담은 객체의 집합

  • 글로벌스코프, 함수스코프 등.. 스코프의 코드는각각의 실행 컨텍스트를 생성한다.

    • 글로벌 스코프는 실행 이전에 생성되지만, 함수스코프는 함수 호출 시 생성된다.

    • 글로벌 스코프는 코드를 실행하기 전에 쌓이고 모든 코드를 실행하면 제거된다.

  • 실행 컨텍스트가 생성되면 흔히 콜 스택(Call Stack)이라고도 불리는 실행 컨텍스트 스택에 쌓이게 된다.

 

구성요소

  • 어휘 환경(Lexical Environment)

    • 변수 및 함수 등의 식별자(Identifier) 및 외부 참조에 관한 정보를 가지고 있는 컴포넌트

    • 구성요소

      • Environment Record (식별자에 관한 정보)

      • outer 참조 (외부 Lexical Environment를 참조하는 포인터)

  • 변수 환경(Variable Environment)

    • var 로 선언된 변수만 저장한다.

      • var 로 선언된 변수를 제외하고 나머지(let 으로 선언되었거나 함수 선언문)를 저장

  • this 바인딩

    • this 객체에 어떻게 바인딩이 되는지를 나타낸 것

      • 글로벌스코프

        • 글로벌 객체로 바인딩되며(브라우저 window, 노드 global) strict mode라면 undefined

      • 그 외

        • 함수가 어떻게 호출되었는지에 따라 바인딩

 

과정

  • 생성단계

    • 값이 변수에 매핑되지 않는다

    • 구성

      • Lexical Environment 생성

      • Variable Environment 생성

      • this 바인딩

  • 실행단계

 

 


 

 

취준생이 반드시 알아야 할 프론트엔드 지식들

https://github.com/baeharam/Must-Know-About-Frontend

 

실행컨텍스트(Execution Context)

https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/execution-context.md

 

User-Agent Client Hints의 도입, UA 프리징을 대비하라

클라이언트 입장의 User-Agent Client Hints
유저의 많은 정보를 담고 있기 때문에 개인정보 침해가 우려, UA를 점진적 삭제할 예정이라고 예전에 포스팅 했었다.
당장에 무엇을 수정해야하는지, 언제 해야하는지 몰라서 고민하던 중에 네이버 개발블로그에서 작업한 내용에 대한 포스팅했더라.

 

 

UA 프리징으로 달라지는 점

  • 속성 값 고정

    • navigator.userAgent

    • navigator.appVersion

    • navigator.platform

    • navigator.productSub

    • navigator.vendor

  • 크롬에서 안드로이드를 제외한 모든 운영체제는 윈도우10

  • 동기방식으로 OS이름, OS버전, 모델명을 알 수 있음

  • 비동기 방식으로 os이름, 버전, 모델명, 브아루저 풀 버전을 알 수 있음(기존 사용하던 로직 사용하려면)

  • navigator.userAtent 대신 navigator.userAgentData를 사용해야함

    • 브라우저버전은 메이저 버전만 나타냄

 

usetAgentData 

이미지 출처 : 원본글  https://d2.naver.com/helloworld/6532276

 

동기 방식으로 확인 가능한 정보

  • navigator.userAgentData.brands 브라우저의 이름과 메이저 버전, Chromium 정보

  • navigator.userAgentData.mobile 모바일 여부

  • navigator.platform: Android Chrome(Linux armv8l) 여부

  • User-Agent Client Hints를 지원하지 않는 브라우저의 OS, OS 버전(Chrome 84의 지원 범위: Android 5.0 이상, Mac OS X 10.10 이상, 윈도우 7 이상)

 

비동기 방식으로 확인 가능한 정보

  • 기존 User-Agent string으로 얻은 정보와 동일한 정보를 얻을 수 있음

    • Android, iOS, Mac Safari를 제외한 OS 정보

    • 특정 OS 버전

    • 브라우저의 풀버전

  • getHighEntropyValues 메서드를 통해 비동기로 필요한 정보 가져올 수 있음

    • navigator.userAgentData.getHighEntropyValues 메서드로 정확한 agent 값을 얻을 수 있도록 만든 getAccurateAgent 비동기 함수

navigator.userAgentData.getHighEntropyValues([
    "architecture",
    "model", "platform",
    "platformVersion",
    "uaFullVersion",
]).then(info => {
    console.log(info);
});
async function start() {
    const agent = await getAccurateAgent();
    const isWindows = agent.os.name === "window";
    const isMac = agent.os.name === "mac";
}

 

크롬을 제외 타 브라우저는 아직 도입 예정이 없음? 그렇기 때문에 어떤식으로 UA 정보를 수정 도입할 지 추측 중..

 

 


 

출처

User-Agent Client Hints의 도입, UA 프리징을 대비하라

https://d2.naver.com/helloworld/6532276

 

예전 포스팅 

크롬 사용자에이전트 문자열(UA, User agent string) 점진적 삭제

https://okayoon.tistory.com/entry/%ED%81%AC%EB%A1%AC-%EC%82%AC%EC%9A%A9%EC%9E%90%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8-%EB%AC%B8%EC%9E%90%EC%97%B4UA-User-agent-string-%EC%A0%90%EC%A7%84%EC%A0%81-%EC%82%AD%EC%A0%9C

 

+ Recent posts