전역 객체는 전역 스코프를 갖는 전역 변수를 프로퍼티로 갖고 있다. 글로벌 영역에서 선언한 함수는 전역객체의 프로퍼티로 접근할 수 있는 전역 변수 메서드이다.
var ga ='Global variable';console.log(ga); // Global variableconsole.log(window.ga); // Global variablefunctionfoo() {console.log('invoked!');}window.foo(); // invoked!
const나 let 키워드로 선언된 전역 변수는 전역 객체의 프로퍼티가 아니다.
```javascript=
const constVar = 'Const Global Varable';
console.log(window.constVar); // undefined
const funcTest = function(){ console.log('function invoked!'); } window.funcTest(); // VM3802:1 Uncaught TypeError: window.funcTest is not a function window.funcTest // undefined
- **기본적으로 this는 전역객체에 바인딩된다.**
- **내부함수**의 경우에도 전역 객체에 바인딩된다.
```javascript
function foo() {
console.log("foo's this: ", this); // window
function bar() {
console.log("bar's this: ", this); // window
}
bar();
}
foo();
형식이 정해져있지 않으며, 기존 함수에 new 연산자를 붙여서 호출하면, 해당 함수는 생성자 함수로 동작한다.
일반적으로 생성자 함수명은 첫 문자를 대문자로 표기하여, 생성자 함수임을 나타낸다.
생성자 함수 동작 방식
new 연산자로 생성자 함수 호출 시 다음과 같은 순서로 동작한다.
1. 빈 객체 생성 및 this 바인딩
빈 객체가 생성되고, 생성자 함수 내부의 this는 이 빈 객체를 가리킨다.
객체의 __proto__는 자신의 프로토타입 객체로 생성자 함수의 prototype object를 가리킨다. 이 객체는 생성자 함수의 prototype 프로퍼티가 가리키고 있다.
2. this를 통한 프로퍼티 생성
빈 객체에 동적으로 프로퍼티나 메서드를 생성한다. 이 때, this는 새로 생성된 객체를 가리키므로, this를 통해 생성한 프로퍼티와 메서드는 새로 생성된 객체에 추가된다.
3. 생성된 객체 반환
반환문이 없는 경우, this에 바인딩된 새로 생성한 객체가 반환된다. 명시적으로 this를 반환한 것과 같은 결과이다.
functionFood(name) {this.name = name;returnthis; // 명시적으로 this를 반환하지 않아도, 새로 생성된 객체가 반환된다.}constapple=newFood("apple");console.log(apple.name); // apple
반환문이 this가 아닌 다른 객체를 명시적으로 반환한다면, this가 아닌 해당 객체가 반환된다. 해당 함수는 생성자 함수로서의 역할을 수행하지 못한다.
### 생성자 함수에 new를 붙이지 않고 호출할 경우
생성자 함수에 new를 붙이지 않고 호출할 경우, 일반 함수를 호출한 것이기에, this를 반환하지 않는다. 이 때 함수 내의 this는 전역 객체를 가리키게 된다.
```javascript
function Seat(number) {
this.number = number;
}
// new 키워드 없이 호출할 경우, this는 전역 객체에 바인딩된다.
// 또한, 반환문이 없으므로 undefined를 반환하게 된다.
const myseat = Seat(1);
console.log(myseat); // undefined
console.log(window.number); // 1
이처럼 생성자 함수를 new 키워드 없이 호출하게 되면, new 키워드로 생성한 것과 다른 결과를 초래한다. 따라서 그러한 실수를 방지하고자 Scope-Safe Constructor로 생성자 함수를 만들게 된다. 이 패턴은 대부분의 라이브러리에서 광범위하게 사용된다.
arguments.callee는 함수 바디 내에서 현재 실행중인 함수의 이름이다. this가 현재 호출된 함수의 인스턴스가 아니라면, new 키워드 없이 호출된 함수이다. 따라서 new 키워드와 함께 생성자 함수를 호출하여, 새로운 객체에 this가 바인딩된 객체를 반환하도록 한다.
🌳 4. apply, call, bind 호출
기본적으로 this는 함수 호출 패턴에 따라 자바스크립트 엔진에 의해 this가 바인딩된다.
명시적으로 this를 특정 객체에 바인딩하려면, Function.prototype.apply, Function.prototype.call, Function.prototype.bind 메소드를 사용하면 된다.