환경 대상

2314 단어
환경 대상this에 대한 학습에 관하여 앞에 있는 글은 비화살표 함수에서this가 어느 대상을 가리키는지에 대한 문제를 묘사한 적이 있는데 여기에 보충을 하고자 한다.
this에 대한 흔한 오해: 함수 대상 자체를 가리키지만 사실은 그렇지 않다. 예를 들어 다음과 같다.
function foo(num){
  console.log("foo:"+ num)
  this.count++
}
foo.count = 0
for(var i = 0; i < 10; i++){
  if(i > 5){foo(i)}
}
console.log(foo.count)//0
console.log(window.count)//NaN

운행 결과가 0인 것을 보면this가 함수 자체를 가리키는 것이 아니라는 것을 추측할 수 있다.그리고 여기서 우리는 this가 누구를 가리키는지 분석할 수 있다.우선, 호출 위치를 찾고 이어서 호출 방식을 살펴보면 여기가 일반 호출이기 때문에this는 전역 대상을 가리킨다.이로 인해count값이 전역 작용역으로 유출되었다.문제는 왜 카운트의 값이 10이 아니라 Nan입니까?정답은 카운트의 초치가 undefined이기 때문이다.
물론 우리도this가 자신을 가리키도록 강요할 수 있다.call,apply,bind 등 방법을 이용하여 이 목적을 달성할 수 있다.다음은 예를 들어 위의 이 예를 수정한다.
function foo(num){
  console.log("foo:"+ num)
  this.count++
}
foo.count = 0
for(var i = 0; i < 10; i++){
  if(i > 5){foo.call(foo, i)}
}
console.log(foo.count)//4

**엄격한 모드를 사용한다면 일반적인 방식으로 비화살표 함수를 호출하면this는 전역 작용역에 귀속되지 않습니다. 더 정확히 말하면 어디에도 귀속되지 않습니다.**
function foo(){
  "use strict"
  console.log(this.a)
}
var a = 2
foo()//TypeError: this is undefined

다음 몇 가지 예를 완성하고 작은 테스트를 해보자.
function foo(){console.log(this.a)}
function doFoo(fn){fn()}// 
var obj = {"a": 2, "foo": foo}
var a = "oops, global"
doFoo(obj.foo)//"oops, global"

예2:
function foo(){console.log(this.a)}
var obj = {"a": 2, "foo": foo}
var a = "oops, global"
setTimeout(obj.foo, 1000)//"oops, global"

예3:
function foo(something){this.a = something}
var obj1 = {}
var bar = foo.bind(obj1)
bar(2)// new 
console.log(obj1.a)//2
var baz = new bar(3)
console.log(baz.a)//3
console.log(obj1.a)//2

예 4:
function foo(){console.log(this.a)}
var a = 2
var obj = {"a": 3, "foo": foo}
var p = {"a": 4}
obj.foo()//3
(p.foo = obj.foo)()//2

예5:
function Fun(name){this.name = name}
var Bind = Fun.bind("window")
var obj = new Bind("bighai")
console.log(obj.name)//"bighai"
console.log(window.name)//undefined

분석에 의하면 여기는 하드 귀속 함수가 구조 함수로 호출되기 때문에 환경 대상인this는 new를 가리키는 대상이다.규정이네요.
END

좋은 웹페이지 즐겨찾기