2011-01-05 5 views
3

나는 this에 대한 질문을 JavaScript에서 가지고 있습니다.JavaScript의 "this"예약어에 대한 질문입니다.

Function.prototype.method = function (name, func) { 
    if (!this.prototype[name]) { 
     this.prototype[name] = func; 
    }   
}; 

String.method('deentityify', function() { 

    var entity = { 
     quot: '"', 
     lt: '<', 
     gt: '>' 
    }; 

    return function() { 

     /*if (this === String.prototype) { 
      alert('true'); 
     } else { 
      alert('false'); 
     }*/ 

     return this.replace(/&([^&;]+);/g, 
      function (a, b) { 
       var r = entity[b]; 
       return typeof r === 'string' ? r : a; 
      } 
     ); 
    }; 
}()); 

document.write('&lt;&quot;&gt;'.deentityify()); 

당신은에서 위의 코드를 편집 할 수 있습니다 : 아래

체크 아웃 코드 http://jsfiddle.net/G3Tkm/

내 질문은 :

27 return this.replace(/&([^&;]+);/g,이 줄에서 this 예약어 무엇입니까?

내가 맞춰 보면 : this === String.prototype,하지만 그렇지 않습니다.

'&lt;&quot;&gt;' 유형은 문자열이며 this 유형이 대상입니다. 따라서 this !== '&lt;&quot;&gt;'

대단히 감사합니다. 나는에 그것의 주변 기능을 찾을 때까지 내가 자바 스크립트 코드에서 this 키워드를 찾을 때마다

답변

5

나는 대개 위쪽으로 보인다.

은 그 때 나는 시도하고이 기능이 외부 에서 호출되는 방법을 이해. 함수가 호출되는 방법에 따라 this의 값이 변경되기 때문에 이는 중요합니다.

코드에서 String.method() 님의 작업은 문자열 개체의 프로토 타입 체인에 메서드를 추가하는 것입니다. 이것은 당신이 정말로해서는 안되는 것입니다, 그것은 일종의 JavaScript 동작이 아니며 나중에 어떤 문제가 발생할 수 있습니다.

그러나, "foo".deentityify() 등 당신이 문자열에 deentityify 메소드를 호출 할 때마다 설명을 위해, 위해 - String.method 작품은 내가 생각하는 경우 this (효과에서 다른 함수 자체가된다 - String.method('deentityify', function() {는이 당신이 할당 어떤 호출 가정).

"foo".deentityify()()을 사용하는 경우 this"foo".deentityify() 인 발신자를 나타냅니다. "foo".deentityify()의 발신자는 실제로 "foo"입니다.

기본적으로 this은 메서드를 호출하는 String 개체를 참조합니다.

관련 문제