이 대상은 항상 JS의 함정이었으며, 무엇을 가리키는 지 판단하기가 어렵습니다. 우리는 종종 C ++ 또는 Python의 경험으로 인해 이런 종류의 실수를합니다. 다음 으로이 개체의 소유권에 대해 자세히 이야기 해 봅시다.
규칙 1 : 이것은 지구 환경에서
JavaScript의 환경은 본질적으로 기능에 의해 결정됩니다. JS에서는 컨텍스트를 코드 블록으로 분리 할 수 없습니다. 기능에 의해 포장되지 않은 환경은 지구 환경입니다. 지구 환경에서는 글로벌 변수 창을 가리 킵니다. 다음 예를 참조하십시오
코드 사본은 다음과 같습니다.
var name = 'jjj';
Console.log (this.name);
// JJJ가 성공적으로 출력됩니다
규칙 2 : 이것은 방법으로 호출 될 때
분명히이 상황은 판단하기 쉽고 파이썬의 자체와 일치합니다. 이것은 의심 할 여지없이 메소드를 호출하는 객체를 가리 킵니다.
코드 사본은 다음과 같습니다.
var user = {
이름 : 'kkk'
};
user.getName = function () {
Console.log (this.name);
};
user.getName ();
// 출력 kkk가 출력됩니다
규칙 3 : 이것은 생성자로서
나는 지금 이것에 대해 많이 말할 필요가 없습니다. 분명히 새로 생성 된 객체를 가리 킵니다. 생성자의 작동은 실제로 객체를 생성하는 것이 아니라 단지 초기화입니다. 객체는 실행되기 전에 생성됩니다.
다음은 몇 가지 예입니다
코드 사본은 다음과 같습니다.
기능 사용자 (이름) {
this.name = 이름;
}
var f1 = 새로운 사용자 ( 'kkk');
var f2 = user ( 'kkk');
Console.log (f1.name); // kkk
console.log (f2.name); // 정의되지 않은 이름 속성이 없습니다
규칙 4 :이 간접적 인 호출
소위 간접 호출은 apply and call to call functions를 사용하는 것을 말하며, 이는 매개 변수 목록의 첫 번째 매개 변수를 가리 킵니다.
코드 사본은 다음과 같습니다.
var setname = function (name) {
this.name = 이름;
};
var user = {level : 2};
user.Apply (setName, 'jjj');
Console.log (user.name); // jjj
규칙 5 : 이것은 다른 경우에
다른 상황에서는 이것이 바뀌지 않을 것이며, 이것은 실수를하기에 가장 쉬운 곳이기도합니다.
코드 사본은 다음과 같습니다.
var name = "Clever Coder";
var person = {
이름 : "foocoder",
안녕하세요 : 기능 (STH) {
var sayshello = function (sth) {
console.log (this.name + "는" + sth);
};
Sayhello (STH);
}
}
person.hello ( "Hello World"); // Clever Coder는 Hello World라고 말합니다
위의 코드는 이상하게 보입니다.
중첩 된 함수 의이 기능은 중첩 된 함수를 가리키지 않을 것임을 기억해야합니다. 이 예에서 Sayshello의 이것은 hello에 해당하는 함수를 가리키지 않습니다. 예제를 약간 변경하면
코드 사본은 다음과 같습니다.
안녕하세요 : 기능 (STH) {
console.log (this.name + "는" + sth);
}
// foocoder는 Hello World를 말합니다
모든 사람은 현재 Sayhello가 방법으로 부르지 않는다는 것을 이해해야했기 때문에 글로벌 객체를 가리 킵니다. . .
이 시점에서 문제는 노드를 사용하여 실행하는 초기 예가 undefined say hello world를 보여줄 것입니다. 설명 할 마스터가 있는지 궁금합니다.
규칙 6 : 평가는 모든 규칙을 중단합니다
마침내 예로 끝납니다
코드 사본은 다음과 같습니다.
var name = "Clever Coder";
var user = {
이름 : 'kkk'
};
user.getName = function () {
Console.log (this.name);
};
var get = user.getName;
get (); // 영리한 코더
이해했나요?