자바 스크립트 this
간단한 함수 호출
다음 기능을 고려하십시오.
function foo() {
console.log("bar");
console.log(this);
}
foo(); // calling the function
우리는 이것을 일반 모드에서 실행하고 있습니다. 즉, 엄격 모드는 사용되지 않습니다.
브라우저에서 실행할 때의 값 this
은로 기록됩니다 window
. 이 때문입니다window
웹 브라우저 범위의 전역 변수 입니다.
node.js와 같은 환경에서 동일한 코드를 실행하면 this
앱의 전역 변수를 참조합니다.
이제 "use strict";
함수 선언의 시작 부분에 명령문 을 추가하여 엄격 모드에서 이것을 실행하면 this
더 이상 환경 중 하나에서 전역 변수를 참조하지 않습니다. 엄격 모드에서 혼동을 피하기 위해 수행됩니다. this
이 경우에는 그냥 로그undefined
입니다. 그것이 정의 된 것이 아니기 때문입니다.
다음과 같은 경우에 우리는 this
있습니다.
객체에서 함수 호출
이를 수행하는 다른 방법이 있습니다. forEach
and와 같은 Javascript에서 원시 메소드를 호출 한 경우, 해당 경우 변수가 해당 함수를 호출 한 것을 참조한다는 slice
것을 이미 알고 있어야 합니다 (javascript에서는 거의 모든 것이 s 및 s를 포함하여 ). 예를 들어 다음 코드를 사용하십시오.this
Object
Object
Array
Function
var myObj = {key: "Obj"};
myObj.logThis = function () {
// I am a method
console.log(this);
}
myObj.logThis(); // myObj is logged
Object
에 속성이 포함 된 속성이 포함되어 있으면 속성을 Function
메소드라고합니다. 이 메소드는 호출 될 때 항상 연관된 this
변수로 설정됩니다 Object
. 이는 엄격 및 비 엄격 모드 모두에 해당됩니다.
메소드가 다른 변수에 저장되거나 복사되는 경우 참조 this
는 더 이상 새 변수에 유지되지 않습니다. 예를 들면 다음과 같습니다.
// continuing with the previous code snippet
var myVar = myObj.logThis;
myVar();
// logs either of window/global/undefined based on mode of operation
보다 일반적으로 실용적인 시나리오를 고려하십시오.
var el = document.getElementById('idOfEl');
el.addEventListener('click', function() { console.log(this) });
// the function called by addEventListener contains this as the reference to the element
// so clicking on our element would log that element itself
new
키워드
Javascript에서 생성자 함수를 고려하십시오.
function Person (name) {
this.name = name;
this.sayHello = function () {
console.log ("Hello", this);
}
}
var awal = new Person("Awal");
awal.sayHello();
// In `awal.sayHello`, `this` contains the reference to the variable `awal`
어떻게 작동합니까? new
키워드를 사용할 때 어떤 일이 발생하는지 봅시다 .
new
키워드로 함수를 호출하면 Object
의 유형 이 즉시 초기화 Person
됩니다.
- 이 생성자는
Object
생성자를로 설정했습니다 Person
. 또한 typeof awal
반환 Object
만합니다.
- 이 새로운 것에
Object
는의 프로토 타입이 할당됩니다 Person.prototype
. Person
이는를 Person
포함하여의 모든 인스턴스 에서 프로토 타입의 모든 메소드 또는 속성을 사용할 수 있음을 의미합니다 awal
.
- 함수
Person
자체가 이제 호출됩니다. this
새롭게 구성된 객체에 대한 참조 awal
입니다.
아주 간단합니까?
공식 ECMAScript 사양에는 이러한 유형의 기능이 실제 constructor
기능 이라고 명시되어 있지 않습니다. 그것들은 단지 정상적인 기능이며 new
모든 기능에서 사용될 수 있습니다. 단지 우리가 그것들을 그대로 사용하는 것 뿐이므로, 그것들을 그렇게 만 부릅니다.
함수에서 함수 호출 : call
및apply
그래서 그래, 이후 function
의도 있습니다Objects
(그리고 실제로 Javascript의 첫 번째 클래스 변수이기 때문에) 함수조차도 함수 자체가 있습니다.
모든 기능은 세계에서 상속 Function
, 그 많은 방법이 있습니다 call
와 apply
, 둘 다의 값을 조작하는 데 사용할 수있는 this
가 호출되는 함수를.
function foo () { console.log (this, arguments); }
var thisArg = {myObj: "is cool"};
foo.call(thisArg, 1, 2, 3);
사용하는 일반적인 예입니다 call
. 기본적으로 첫 번째 매개 변수 this
를 사용하고 함수 foo
에 대한 참조로 설정 thisArg
합니다. 전달 된 다른 모든 매개 변수는 인수로 call
함수에 전달됩니다 foo
.
따라서 위의 코드는 {myObj: "is cool"}, [1, 2, 3]
콘솔에 로그인 합니다. 가치를 바꾸는 아주 좋은 방법this
모든 함수에서 입니다.
apply
call
두 개의 매개 변수 만 사용한다는 점 과 거의 동일 thisArg
합니다. 함수에 전달할 인수가 포함 된 배열입니다. 따라서 위의 call
호출은 다음 apply
과 같이 번역 될 수 있습니다 .
foo.apply(thisArg, [1,2,3])
그 주 call
와 apply
의 값을 대체 할 수 있습니다this
우리 번째 탄환에서 설명한 도트 메소드 호출에 의해 설정한다. 충분히 간단하다 :)
발표 .... bind
!
bind
의 형제 call
와 apply
. 또한 Function
Javascript 의 전역 생성자에서 모든 함수에 의해 상속되는 메소드 입니다. 차이 bind
및 call
/ apply
그 모두 인 call
및 apply
것 실제로 기능을 호출한다. bind
반면에는 thisArg
및 arguments
사전 설정을 사용하여 새 함수를 반환합니다 . 이것을 더 잘 이해하기 위해 예를 들어 봅시다.
function foo (a, b) {
console.log (this, arguments);
}
var thisArg = {myObj: "even more cool now"};
var bound = foo.bind(thisArg, 1, 2);
console.log (typeof bound); // logs `function`
console.log (bound);
/* logs `function () { native code }` */
bound(); // calling the function returned by `.bind`
// logs `{myObj: "even more cool now"}, [1, 2]`
세 가지의 차이점을 보시겠습니까? 미묘하지만 다르게 사용됩니다. 같이 call
하고 apply
, bind
또한 값 오버 탈 것 this
도트 메소드 호출에 의해 설정합니다.
또한이 세 기능 중 어느 것도 원래 기능을 변경하지 않습니다. call
그리고 apply
갓 건설 기능에서 값을 반환하면서bind
준비가 갓 건설 기능 자체가, 호출 할 돌아갑니다.
추가 물건, 이것을 복사
때로는 this
범위, 특히 중첩 범위에 따라 변경 되는 사실이 마음에 들지 않습니다 . 다음 예를 살펴보십시오.
var myObj = {
hello: function () {
return "world"
},
myMethod: function () {
// copy this, variable names are case-sensitive
var that = this;
// callbacks ftw \o/
foo.bar("args", function () {
// I want to call `hello` here
this.hello(); // error
// but `this` references to `foo` damn!
// oh wait we have a backup \o/
that.hello(); // "world"
});
}
};
위의 코드 this
에서 중첩 범위로 값이 변경 되었음을 알지만 this
원래 범위에서 값을 원했습니다 . 우리가 '복사'그래서 this
에 that
사용 된 대신의 복사this
. 영리한가?
인덱스:
- 개최 내용
this
기본적으로 됩니까?
- 객체 점 표기법을 사용하여 함수를 함수로 호출하면 어떻게됩니까?
- 우리가
new
키워드를 어떻게 되나요?
- 우리는 어떻게 조작 할
this
로 call
와 apply
?
- 사용
bind
.
this
중첩 된 범위 문제를 해결하기위한 복사