var a = 1;
console.log(a); // 1
console.log(window.a); // 1
console.log(this.a); // 1
전역 변수를 선언하면 자바스크립트 엔진은 이를 전역객체의 프로퍼티로도 할당. 즉, 자바스크립트의 모든 변수는 실은 특정 객체의 프로퍼티로서 동작. 특정 객체란 실행 컨텍스트의 LexicalEnvironment. 실행 컨텍스는 변수를 수집해서 LexicalEnvironment의 프로퍼티로 저장
var obj = {
methodA: function () {
console.log(this);
},
inner: {
methodB: function () {
console.log(this);
},
},
};
obj.methodA(); // obj
obj.inner.methodB(); // obj.inner
__proto__
라는 프로퍼티가 있는 객체(instance)를 만든다. call
const func = function (a, b, c){
console.log(this, a, b, c)
};
func(1, 2, 3, 4) // Window { ... } 1 2 3
func.call({ x:1 }, 4, 5, 6) // { x: 1}, 4 5 6
apply
const func = function (a, b, c){
console.log(this, a, b, c)
};
func(1, 2, 3, 4) // Window { ... } 1 2 3
func.apply({x:1}, [4, 5, 6]) // { x: 1}, 4 5 6
const obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
};
Array.prototype.push.call(obj, 'd');
console.log(obj); // { '0': 'a', '1': 'b', '2': 'c', '3': 'd', length: 4 }
const arr = Array.prototype.slice.call(obj)
console.log(arr) // [ 'a', 'b', 'c', 'd' ]
const numbers =[10, 20 ,30 ,40]
const max = Math.max.apply(null, numbers)
console.log(max) // 40