자바스크립트 this는 같은 소스코드로 호출하는 형태에 따라 의미가 달라서 이를 어렵게 생각하는 경우가 있어서 이를 정리해보았습니다. JavaScript의 this는 크게 4종류가 있다는 것부터 기억하고 시작해 봅시다.
최상위 this
전역 객체를 가리킵니다.
1 2 3 4 5 6 7 8 | var abc = "Kim" ; window.def = " MJ" ; console.log( this .abc + "+" + this .def); ( function (){ console.log( this .abc + "+" + this .def); })(); |
생성자 this
만들어진 인스턴스 자신을 가르킵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | var Abc = function Abc(msg) { this .abc = msg; this .method = function () { console.log( "method+" + this .abc); } } var obj1 = new Abc( "Hello" ); var obj2 = new Abc( "World" ); // Hello 표시 console.log(obj1.abc); // method+Hello 표시 obj1.method(); // World 표시 console.log(obj2.abc); // method+World 표시 obj2.method(); // new를 안붙였기 때문에 Abc내 this는 전역 객체임 Abc( "new가없음" ); console.log(window.abc == "new가없음" ); // method+new가없음! window.method(); |
어떤 것에 소속된 this
소속된 개체를 가리킵니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | var abc = {def: "MJ" }; abc.print1 = function () { console.log( this .def); }; // MJ 표시 abc.print1(); var func = function () { console.log( this .def); }; // window.def가 참조되어 undefined func(); abc.print2 = func; // this가 abc로 변경되어 MJ표시 abc.print2(); // prototype시도 var Abc = function Abc(msg) { this .message = msg; }; Abc.prototype.print = function () { console.log( "prototype+" + this .message); } var obj = new Abc( "Hello" ); // prototype+Hello 표시 obj.print(); |
function#apply나 function #call등으로 강제로 변경될 때 this
jQuery를 사용하여 click이벤트등에서 this를 다시 사용할 때..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | var abc = { def: "MJ" , print: function (){ console.log( this .def); } }; // 어떤 것에 소속된 this라서 MJ표시 abc.print(); var paramour = {def: "NTR" }; // this를 변경하여 NTR표시 abc.print.call(paramour); var Abc = function Abc(msg) { this .message = msg; } Abc.prototype.print = function () { console.log( "Love " + this .message); } var obj1 = new Abc( "Dokdo" ); // Love Dockdo 표시 obj1.print(); obj1.print.call({message: "korea" }); // this를 보호하는 방법 var ProtectedAbc = function ProtectedAbc(msg) { this .message = msg; // this 저장 var _this = this ; this .print = ( function (fn) { // fn에 원래 this.print가 있음 return function () { // 원래 this.print를 _this에 저장해놓은 원본 this를 사용하여 재실행 fn.apply(_this, arguments); }; })( this .print); } ProtectedAbc.prototype.print = function () { console.log( "Love " + this .message); } var obj2 = new ProtectedAbc( "KoreaIsland" ); obj2.print.call({message: "korea" }); |