문제

나는 클래스 기반 상속 모델과 함께 Java 배경에서 나와 JavaScript의 프로토 타입 기반 상속 모델을 둘러보고 있습니다. 나를 버리는 것의 일부, 나는 "이것"에 대한 Java의 의미를 염두에두고 있다고 생각합니다. JavaScript의 "This"는 매우 다른 짐승입니다. JavaScript의 "This"는 항상 함수가 정의 된 범위가 아니라 함수의 발신자를 지칭한다는 것을 이해합니다. 나는 그것을 읽고 그것이 의미하는 바를 피상적으로 이해했음을 의미합니다. 그러나 나는 더 깊이 이해하고 싶고, 다른 이름을 갖는 것이 도움이 될 것이라고 생각합니다. JS에 대해 어떻게 생각하십니까? 당신이 그것을 가로 질러 달릴 때마다 정신적 대체를합니까? 그렇다면 - 어떤 단어 나 문구를 사용하십니까?

도움이 되었습니까?

해결책

this 합리적으로 이름이 바뀔 수 있습니다 context JavaScript에서.

그것은 실제로 현재 범위에 대한 실행 컨텍스트를 언급하고 있으며, 그 컨텍스트는 ~할 수 있다 클래스의 인스턴스가 되십시오. 확실히 할 필요는 없습니다. 전혀 객체가 될 수 있으며 런타임에 수정할 수 있습니다.

JavaScript의 "메소드"가 정의 된 "클래스"의 인스턴스에서 작동한다는 보장이 없다는 증거 :

function Cat(){

     this.texture = 'fluffy';

     this.greet = function(){
         alert("Pet me, I'm " + this.texture);
     }
 }

 var cat = new Cat();

 // Default to using the cat instance as the this pointer
 cat.greet(); // Alerts "Pet me, I'm fluffy"

 // Manually set the value of the this pointer!
 cat.greet.call({texture: 'scaly'});  // Alerts "Pet me, I'm scaly"

거기에 주목하는 것이 중요합니다 의 가치 this 개체는 포함 함수가 정의되는 위치와 완전히 독립적입니다..

다른 팁

가능한 대체 이름 중 하나입니다 owner. 이것은 실행중인 코드에 따라 소유자가 변경할 수있는 방향으로 마음을 이끌 것입니다.

이 예제는 퀴크 스 모드:

JavaScript에서 this 항상 우리가 실행하는 함수의 "소유자"를 말하거나, 오히려 함수가 메소드 인 객체를 나타냅니다. 우리가 페이지에서 충실한 기능 dosomething ()을 정의 할 때 소유자는 페이지이거나 오히려 JavaScript의 창 객체 (또는 글로벌 객체)입니다. 그러나 OnClick 속성은 HTML 요소가 소유하고 있습니다.

다음 코드에서

function doSomething() {
   this.style.color = '#cc0000';
}

그리고

element.onclick = doSomething;

, owner 방법이 실행될 때 메소드를 포함하는 객체를 가리 킵니다.

------------ window --------------------------------------
|                                          / \           |
|                                           |            |
|                                          this          |
|   ----------------                        |            |
|   | HTML element | <-- this         -----------------  |
|   ----------------      |           | doSomething() |  |
|               |         |           -----------------  |
|          --------------------                          |
|          | onclick property |                          |
|          --------------------                          |
|                                                        |
----------------------------------------------------------

나는 JavaScript라고 생각합니다 this Java 's에 훨씬 더 가깝습니다 this 당신이 생각하는 것보다. OOP 맥락에서 this "이 인스턴스"를 의미합니다. JavaScript에 대해 무엇이 혼란 스러울 지 생각합니다 this 키워드는 바로 그 것입니다 ~할 수 있다 상황에 따라 다른 의미를 갖습니다.

this 함수의 발신자가 아니거나 (그렇지 않을 수도 있음) 함수가 정의 된 범위 (하지만) - 함수의 것입니다. 문맥.

@andrew Hare가 언급하는 변화하는 의미는 아마도 당신의 혼란의 원천에 더 가깝습니다. JS의 프로토 타입 상속 메커니즘으로 인해 function 키워드는 사용 방법에 따라 Java의 것과 더 가까운 것을 의미 할 수 있습니다. class Java의 방법 정의보다.

브라우저에서 실행을 가정합니다.

var q = this.document; //this is window

var o = new (function pseudoconstructor(){
    this.property = "something else" //the new keyword changed 'this' to mean 'the object I'm about to return'
})();

'JavaScript this'는 어떻습니까? 그것은 당신이하고있는 일에 직접 묶어 놓고 현재 작업하고있는 '이것'이라는 개념이 JavaScript 개념이라는 정신 상기시켜줍니다.

결국, 나는 당신이 그것을 'JavaScript'라고 부르는 것을 멈추고 '이것'이라고 부르며, 당신이 일하는 맥락에서 그것이 무엇을 의미하는지 완전히 알고 있습니다. 어쨌든 가기 위해.

나는 다음과 같은 유형이 거의없는 정신 모델로 새로운 구문을 흡수합니다.

$(document).ready(function() {

  function baffle() {
    alert(this.b);
  }

  function what() {
    this.b = "Hello";
    baffle();
  }

  function huh() {
    this.b = "World";
    baffle();
  }

  what();
  huh();

  }
);

이것은 심하게 번역하여 조잡하고 가상의 C ++로 다음과 같습니다.

template <class This>
function baffle() {
  alert(This.b);
}

function what() {
  b = "Hello";
  baffle<what>();
}

function huh() {
  b = "World";
  baffle<huh>();
}

what();
huh();

제 생각에는 this 역사적 이유로 가장 적합합니다. 실제로 한 가지 크기에 맞는 문구는 없습니다 this JavaScript에서는 매우 다른 참조에 자동으로 할당 될 수 있으므로 this 절차 적 기능의 맥락에서 또는 this 대상의 맥락에서 this 스크립터가 사용하여 할당 할 수도 있습니다 Function.apply 그리고 Function.call.

그러나의 의미 this JavaScript와 DOM은 매우 이상한 방식으로 작동하기 때문에 조절 가능합니다. 예를 들어, 1 차 사용 Function.apply 이벤트 호출에서 요소 참조의 컨텍스트를 보존하는 것입니다. 당신은 프로토 타스에서 이것을 보았을 것입니다 Function.bind() 방법.

this 기능이 실행되는 상황에 대한 자리 표시 자이며, 그보다 더 구체적으로 얻기가 어렵습니다. 그러나 대부분의 용도 this 의미 적으로 적절한 키워드로 만드십시오. 의 경우 bind(), 비록 우리는 메소드를 사용하여 this 함수 내에서는 만들기 위해 사용해야합니다. this 없는 것보다 더 적합합니다. 많은 아마추어 JavaScript 프로그래머는 이상한 행동에 의해 버려집니다. this 이벤트 핸들러 및 Function.apply 그 "잘못된"바로 맞아야합니다.

자기 참조 논리 (자기 또는이)는 자신 (이) 이외의 다른 작업을 유리하게하기 위해 역설을 피합니다. 스스로 (이것은) 모든 것을 모두 유지해야합니다. 대신 인스턴스가없고 클래스 방법 (정적)으로 정적을 유지할 수 있습니다. 역설을 피하기 위해 자기 참조를 피하고 논리는 모든 진실을 입증 할 수 있고 그 반대를 그대로 유지합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top