var a = 1;
console.log(a); // 1
console.log(window.a); // 1
console.log(this.a); // 1
위와 같은 결과가 나타나는 이유
: JavaScript의 모든 변수는 특정 객체의 프로퍼티로 동작하기 때문
특정객체 = 실행 컨텍스트의 LexicalEnvironment
=> 전역번수 선언 시 JavaScript 엔징은 이를 전역객체의 프로퍼티로 할당
but. 처음부터 전역객체의 프로퍼티로 할당한 경우에는 삭제가 되는 반면 전역변수로 선언한 경우 삭제가 되지 않는다.
var func = function (x) {
console.log(this, x);
}
func(1); // Window{...} 1
var obj = {
method: fuc
};
obj.method(2); // {method: f } 2
var obj1 = {
outer: function() {
console.log(this); // obj1
var innerFunc = function() {
console.log(this); // Window
}
innerFunc();
var obj2 {
innerMethod: innerFunc
};
obj2.innerMethod(); // obj2
}
}
obj1.outer();
위의 차이는 (.)이 있느냐 없느냐의 차이
메서드로서의 함수는 .가 있고 해당 객체를 바라본다.
var obj1 = {
outer: function() {
console.log(this);
var innerFunc1 = function() {
console.log(this);
};
innerFunc1();
var self = this;
var innerFunc2 = function() {
console.log(self);
};
innerFunc2();
}
};
obj1.outer();
setTimeout(function() {console.log(this);}, 300); // 1) window
[1,2,3,4,5].forEach(function(x) {
console.log(this, x); // 2) window
});
document.body.innerHTML += `<button id = 'a'>클릭</button>`;
document.body.querySelector('#a').addEventListener('click', function(a) {
console.log(this,a); // 3) 엘리먼트와 클릭 이벤트 정보
})
3)의 경우 html 엘리먼트에 'click'이벤트 => 콜백함수의 첫번째 인자로 삼아 함수 실행 => 엘리먼트 정보와 이벤트 정보가 담긴 객체 출력
addEventListener 메소드 앞에 .이 있기 때문에 앞의 this즉, querySelector를 상속하도록 되어 있다.
객체지향언어에서
new
명령어와 함께 함수를 호출하면 해당 함수가 생성자로서 동작var Cat = function(name, age) {
this.bark = '야옹';
this.name = name;
this.age = age;
};
var choco = new Cat('초코', 6);
var nabi = new Cat('나비', 8);
console.log(choco, nabi);
결과
Cat {bark: "야옹", name: "초코", age: 6};
Cat {bark: "야옹", name: "나비", age: 8};
new
)var func - function(a, b, c) {
console.log(this, a, b, c);
};
func(1, 2, 3); // Window{...} 1, 2, 3
func.call({x : 1}, 4, 5, 6); // { x : 1 } 4 5 6