490 JS 에서 THIS 에 대한 다섯 가지 상황 분석
* THIS:
THIS WINDOW;
THIS, THIS THIS ;【 。】
,THIS , .
*
* THIS (EC ),THIS
* : ( , , 【THIS】, , 【EC】)
*
*
* ?
* 1. : , , , THIS ( :IE6~8 attachEvent DOM2 , , THIS WINDOW, )。
*
* 2. ( 、 、 ): , “ ”, “ ”,“ ” ,THIS , “ ”,THIS WINDOW[ ]/UNDEFINED[ ]。
*
* 3. (NEW XXX): THIS 。
*
* 4. ES6 ARROW FUNCTION( ): THIS, THIS THIS。
*
* 5. CALL/APPLY/BIND , THIS : ( , )。
// DOM0 DOM2
let body = document.body;
body.onclick = function () {
// , , THIS BODY
console.log(this);
};
body.addEventListener('click', function () {
console.log(this); // => BODY
});
// IE6~8 DOM2
box.attachEvent('onclick', function () {
console.log(this); // => WINDOW
});
// ----------------------------------
// IIFE
(function () {
console.log(this); // => window
})();
// ----------------------------------
let obj = {
fn: (function () {
console.log(this); // => window
return function () {}
})() // OBJ.FN
};
// ----------------------------------
function func() {
console.log(this);
}
let obj = {
func: func
};
func(); // => THIS: WINDOW 【 ,window func】
obj.func(); // => THIS: OBJ【 ,obj func】
// ----------------------------------
// => , ARRAY SLICE ([].slice), SLICE , SLICE THIS
[].slice();
Array.prototype.slice(); // => SLICE THIS:Array.prototype
[].__proto__.slice(); // => SLICE THIS:[].__proto__ === Array.prototype
// ----------------------------------
function func() {
// THIS => WINDOW
console.log(this);
}
document.body.onclick = function () {
// THIS => BODY
func();
};
// ----------------------------------
function Func() {
this.name = "F";
// => THIS “ ” , , THIS.XXX = XXX
console.log(this);
}
Func.prototype.getNum = function getNum() {
// THIS , ,“ ”
console.log(this);
};
let f = new Func; // Func {name: "F"}
f.getNum(); // Func {name: "F"}
f.__proto__.getNum(); // {getNum: ƒ, constructor: ƒ}
Func.prototype.getNum(); // {getNum: ƒ, constructor: ƒ}
// ----------------------------------
let obj = {
func: function () {
console.log(this);
},
sum: () => {
console.log(this);
}
};
obj.func(); // => THIS:OBJ
obj.sum(); // => THIS (EC(G)) THIS: WINDOW
obj.sum.call(obj); // => THIS:WINDOW, THIS,
// ----------------------------------
let obj = {
i: 0,
// func:function(){}
func() {
// THIS: OBJ
let _this = this;
setTimeout(function () {
// THIS:WINDOW THIS WINDOW( )
_this.i++;
console.log(_this);
}, 1000);
}
};
obj.func();
// ----------------------------------
let obj = {
i: 0,
func() {
setTimeout(function () {
// BIND THIS OBJ
this.i++;
console.log(this);
}.bind(this), 1000);
}
};
obj.func();
// ----------------------------------
// ( )
let obj = {
i: 0,
func() {
setTimeout(() => {
// THIS, THIS THIS, OBJ
this.i++;
console.log(this);
}, 1000);
}
};
obj.func();
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.