b가 원본 개체를 잃는 이유는 무엇인가요?
=================보충: 중첩된 함수가 창을 가리킨다는 것을 어떻게 이해하나요? =========================
함수에 대해 이렇게 말하면 실행 중인 실행 환경에 따라 결정됩니다. 예를 들어 여기에서는 obj.a()가 함수의 실행 환경이므로 이것이 obj를 가리키고 실행이 됩니다. b()의 환경은 창이므로 이는 창을 가리킵니다;
그렇다면 중첩된 함수의 이것은 창을 가리킵니다. "이것은 JS의 구문 사양에 의해 규정됩니다."라고 말하는 것과 별도로 JS의 구현 원리에서 이를 어떻게 이해할 수 있습니까?
으아악
이것을 이해하려면 실행 컨텍스트를 이해해야 합니다.
을 읽어보는 것이 좋습니다.http://www.jianshu.com/p/d647...
var b=obj.a;는 var b=function(){console.log(this.label)}과 동일합니다. 여기서는 함수를 선언하는 것과 같습니다. this는 window
를 가리킵니다.선언한 b는 실제로 window.b와 동일하므로 2를 인쇄하는 데 아무런 문제가 없습니다. 이것을 이해하는 것이 중요합니다
를 가리킵니다.obj.a가 실행되는 동안 a는 obj를 가리키고
b()는 window.b()와 동일하며 this는 window
최근 Elevation 3에 관한 책을 읽고 있는데 포스터 원본에 도움이 될 것 같아요.
먼저 범위의 개념을 명확히 할 필요가 있습니다.
obj.1()//1, 이 블록에서 a의 기능에 있는 this의 범위는 객체 obj로 제한되므로 this의 레이블 값은 obj 객체 값에 정의한 속성 레이블입니다. , 이 값은 1입니다.
다음 줄에서는 변수 b를 지정합니다. 그런 다음 b에 obj.a 메서드를 할당합니다. 다음으로 (칠판을 두드리며 중요한 점) b를 전역 범위 환경(창)에서 실행했는데, 이것은 실행 환경에 따라 결정해야 하는 점이므로 전역 범위의 레이블은 범위 환경 값은 첫 번째 줄에 쓴 2로 변경됩니다.
아직 토론을 어떻게 이어가야 할지 모르신다면 이건 제 개인적인 이해에 따른 것입니다
함수 실행 환경에 따라 변경됩니다. 나중에 현재 this를 가져오려면 먼저 변수에 저장하거나 적용/호출/바인딩을 사용하여 바인딩할 수 있습니다
으아악obj.a의 값은 그것이 나타내는 메소드의 주소를 저장합니다.
var b = obj.a
时,b变量存放的也是该方法的地址;而另一方面,全局声明的变量,是
window
的属性,故window.b == b
是成立的;调用
b()
时,就相当于window.b()
一样。再跟obj.a()
비교하면물론 전역 개체 창을 가리킵니다. 좋아요를 눌러도 괜찮습니다
모든 분들의 답변을 읽고 제가 이해한 내용을 추가한 후 스스로 묻고 대답했습니다.
메모리에 있는 obj의 저장 상태를 기준으로 이해했습니다. 저도 처음에는 여기서 혼란을 겪었습니다.
으아악obj에서는 label과 1이 모두 obj에 저장되고, a는 obj에 변수로 저장되고, a에 해당하는 함수의 엔터티는 obj 외부에 저장되고, obj는 포인터만 저장됩니다. 따라서 obj.a()의 this는 엔터티 함수가 존재하기 때문에 a를 가리키는 것이 아니라 호출 시 격리된 엔터티 함수가 obj의 실행 환경에 있기 때문에 a를 가리킵니다. 윈도우에도 고립된 엔터티 함수가 호출되면 윈도우의 실행 환경에 있기 때문이죠
결론만 보면 함수 내부의 this 지점은 호출 메서드에 따라 결정됩니다. 함수가 객체에 의해 소유된 경우 this는 객체를 가리키고, 함수가 독립적으로 호출되면 this는 정의되지 않음을 가리키고 non을 가리킵니다. -strict 모드는 전역 개체를 가리킵니다.