Table of contents

0. Introduction

자바스크립트의 모든 값은 그 값으로 각기 다른 작업들을 할 수 있도록 설계된 비헤이비어 세트를 가지고 있다. 추상적으로 들리므로, message 라는 이름의 변수와 관련된 간단한 예제를 살펴보자.

// Accessing the property 'toLowerCase'
// on 'message' and then calling it
message.toLowerCase();

// Calling 'message'
message();

첫번째 줄을 보면, toLowerCase 라고 불리는 프로퍼티에 접근한 뒤에 호출하고 있다.

두번째는 message 를 직접적으로 호출하고 있다.

하지만 우리가 message 의 값을 모른다고 가정해보자.(이런 일은 매우 흔하다) 우리는 이 코드를 실행하였을 때 어떤 결과가 도출될지 확실하게 대답할 수 없다.

각 작업의 비헤이비어는 처음으로 그 작업을 정의한 곳에 전적으로 의존하게 된다.

이 질문들에 대한 대답은 보통 우리의 머리 속에 저장해두고, 자바스크립트로 코드를 작성할 때, 그 상세한 내용까지 모두 맞기를 바라기만 해야 한다.

만약 message 가 다음과 같이 정의되어 있다고 해보자.

const message = "Hello World!";

우리가 코드를 실행하면, 자바스크립트 런타임은 변수 값의 타입을 특정함으로써 그 변수가 어떤 종류의 비헤이비어와 기능을 가지고 있어야 하는지 결정한다.

이 시점에서 messagemessage() 와 같은 형식으로 호출하였다고 하면, TypeError 인 "Hello World" cannot be called as a function. 이라는 메시지가 출력될 것이다.

stringnumber 와 같은 몇 가지 데이터 타입은 typeof 라는 연산자를 사용하여 그 타입을 알아낼 수 있다. 하지만 함수와 같은 나머지 데이터 타입들은 그 타입을 식별할 수 있는 런타임 메커니즘이 없다. 예를 들어 아래 예제의 함수를 보면,