어떤 객체가 이 함수를 호출하는지, 이 함수의 this가 이 객체를 가리킨다는 정보를 많이 봤습니다.
다음 예에서 함수 foo는 foo() 문을 통해 호출됩니다. 이것이 전역을 가리키는 이유는 무엇입니까? Window.foo()가 전역 개체에 의해 호출되지 않습니까?
조언 부탁드립니다. 감사합니다!
给我你的怀抱2017-06-26 10:54:59
위에서 말한 내용에 문제가 있습니다. Foo는 전역 변수가 아닙니다. (엄격하지 않은 모드) 간단한 판단 방법은 다음과 같습니다.
1. 함수에 상위 개체가 할당되지 않은 경우 이는 창을 가리킵니다.
2 . 함수가 할당될 때 상위 객체의 경우 이는 foo.fn.o()와 같은 가장 가까운 상위(부모) 객체
만 가리킵니다. o의 this는 fn을 가리킵니다
代言2017-06-26 10:54:59
内部函数
,即声明在另一个函数体内的函数,都将会绑定到全局对象
上,这是JavaScript的设计缺陷
의 경우 올바른 설계 방법은 내부 함수의 this를 외부 함수에 해당하는 객체에 바인딩해야 한다는 것인데, 이로 인해 위와 같은 문제가 발생합니다.
이 디자인 결함을 피하기 위해 变量替代
的方法,约定俗成,可以使用self
或that
를 사용할 수 있으며 코드는 다음과 같습니다.
PHP中文网2017-06-26 10:54:59
먼저 한 가지만 이해해 봅시다.
1: 창문은 하나의 사물이기도 하고, 특별한 사물이며, 전 세계를 대표합니다. 다음과 같은 방법으로 함수를 호출하는 경우:
function foo(){....}
foo();//
두 번째 줄의 호출 메서드(함수 앞에는 사용자가 정의한 개체가 없습니다) , 우리는 그것을 '글로벌 콜'이라고 부릅니다. 실제로는 window.foo()와 동일합니다. 그래서 봤어? 전역적으로 함수를 호출하는 것은 실제로 객체에서 함수를 호출하는 특별한 경우입니다. 왜냐하면 이 시점의 객체는 window이기 때문입니다.
2: 그렇다면 위 코드는 왜 obj 대신 전역적으로 foo()를 호출합니까? 코드를 변경하여 20:
두 코드를 비교하고 차이점을 찾아보세요.
曾经蜡笔没有小新2017-06-26 10:54:59
다음과 같이 코드를 다시 작성할 수 있습니다.
으아악위의 예를 통해 함수를 호출할 때 call이나 apply의 형태로 자바스크립트 파서가 호출된다는 것을 알 수 있습니다. 이런 식으로 함수에 이에 대한 값을 지정하세요. 이 두 메소드의 첫 번째 매개변수는 호출 시 foo 메소드의 내부 this 값입니다. call 메소드의 첫 번째 매개변수가 null이거나 정의되지 않은 경우 기본적으로 전역 객체가 첫 번째 매개변수로 사용됩니다. foo.call(), foo.call(null), foo.call(undefine))을 사용해 보세요