>  기사  >  웹 프론트엔드  >  이에 대한 자세한 설명은 javascript_javascript 스킬에서

이에 대한 자세한 설명은 javascript_javascript 스킬에서

WBOY
WBOY원래의
2016-05-16 16:28:151209검색

이 객체는 항상 js의 함정이었습니다. 그것이 무엇을 가리키는지 판단하기가 어렵고, C나 Python의 self에 대한 경험으로 인해 이러한 유형의 실수를 자주 저지릅니다. 다음으로 이 객체의 소유권에 대해 자세히 이야기해 보겠습니다.

rule1: 지구 환경의

JavaScript의 환경은 본질적으로 함수에 의해 결정됩니다. JS에서는 컨텍스트를 코드 블록으로 구분할 수 없습니다. 함수로 래핑되지 않은 환경은 전역 변수 창을 가리킵니다. 다음 예

코드 복사 코드는 다음과 같습니다.

var 이름='jjj';
console.log(this.name);
//jjj를 성공적으로 출력합니다

rule2: this

메소드로 호출되는 경우

분명히 이 상황은 판단하기 쉽습니다. 이는 Python에서 self와 일치합니다. 이는 의심할 여지없이

메서드를 호출하는 개체를 가리킵니다.

코드 복사 코드는 다음과 같습니다.

var 사용자={
이름:'kkk'
};
user.getName=함수(){
console.log(this.name);
};
user.getName();
//출력하겠습니다ㅋㅋㅋ

rule3: this

생성자로 사용되는 경우

물론 이때는 새로 생성된 객체를 가리키는 것이 분명합니다. 생성자를 실행하면 실제로 객체가 생성되지 않고 초기화만 됩니다.
다음은 몇 가지 예입니다

코드 복사 코드는 다음과 같습니다.

함수 사용자(이름){
This.name=이름;
}
var f1=새 사용자('kkk');
var f2=사용자('kkk');
console.log(f1.name);//kkk
console.log(f2.name);//undef에는 이름 속성이 없습니다

규칙4: 간접 호출의 경우

소위 간접 호출은 호출 기능에 적용 및 호출을 사용하는 것을 의미합니다. 이때 이는 해당 매개변수 목록의 첫 번째 매개변수를 가리킵니다.

코드 복사 코드는 다음과 같습니다.

var setName=함수(이름){
This.name=이름;
};
var 사용자={레벨:2};
user.apply(setName,'jjj');
console.log(user.name);//jjj

규칙5: 다른 상황에서는 이

이는 다른 경우에도 변경되지 않으며 실수가 발생할 가능성이 가장 높다는 점을 기억하세요.

코드 복사 코드는 다음과 같습니다.

var 이름 = "영리한 코더";
var 사람 = {
이름 : "foocoder",
안녕하세요: 함수(sth){
var sayhello = 함수(sth) {
console.log(this.name "은 " sth를 말합니다);
        };
          인사(sth);
}
}
person.hello("hello world");//영리한 코더가 hello world를 말합니다

위 코드가 사람을 가리키는 게 이상하지 않나요?
중첩된 함수의 this는 중첩된 함수를 가리키지 않는다는 점을 기억해야 합니다. 이 예에서 sayhello의 this는 hello에 해당하는 함수를 가리키지 않습니다. 예를 살짝 바꿔서

코드 복사 코드는 다음과 같습니다.

안녕하세요:함수(sth){
console.log(this.name "은 " sth를 말합니다);
}
//foocoder가 Hello World라고 말합니다

현재 sayhello는 메서드로 호출되지 않으므로 전역 개체를 가리킨다는 점을 모두가 이해해야 합니다. . .
이때 문제가 발생합니다. node를 사용하여 초기 예제를 실행하면 정의되지 않은 hello world가 표시됩니다. 설명할 수 있는 사람이 있는지 궁금합니다.

rule6:eval이 모든 규칙을 위반합니다

마침내 예시로 마무리

코드 복사 코드는 다음과 같습니다.

var 이름 = "영리한 코더";
var 사용자={
이름:'kkk'
};
user.getName=함수(){
console.log(this.name);
};
var get=user.getName;
get();//영리한 코더

이해하셨나요?

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.