Javascript this 키워드 사용 분석

12081 단어 Javascriptthis
js 중의 this 키워드 에 관 한 글 이 이미 적지 않 습 니 다.저 는 몇 편 을 보 았 습 니 다.제 가 이 글 을 쓰 는 목적 은 사례 에서 this 의 작업 원 리 를 분석 하고 여러분 에 게 도움 이 되 기 를 바 랍 니 다.1.기본 적 인:
 
function doSomething(){
alert(this.id);
}
alert(window.doSomething);// doSomething window
doSomething();//undefined
window.onload = function(){
document.getElementById("div2").onclick = doSomething;//div2
document.getElementById("div3").onclick = function(){doSomething();}//undefined
}
1.doSomething 이라는 함수 에 대해:
 
function doSomething(){
alert(this.id);
}
이 함 수 는 전체 함수 입 니 다.이러한 전체 함 수 는 실제 적 으로 window 에 속 합 니 다(window.doSomething 을 통 해 접근 할 수 있 습 니 다).직접 호출 하면"this always reference to the"owner"of the function we're executing"에 따라 함수 중의 this 는 window 입 니 다.그러나 window 에 id 속성 이 없 기 때문에"undefined"를 표시 합 니 다.2.html 요소 에서 이렇게 호출 합 니 다
 
<div id="div1" onclick="doSomething();">div1</div>
이때 도'undefined'가 표 시 됩 니 다.이것 은 다음 과 같은 코드 에 해당 합 니 다
 
document.getElementById("div1").onclick = function(){doSomething();}
div 1 을 클릭 할 때 window 에 속 하 는 doSomething 함 수 를 호출 하기 때문에'undefined'도 표 시 됩 니 다.3.js 를 통 해 이 벤트 를 연결 합 니 다.div 2 를 불 러 온 후:
 
document.getElementById("div2").onclick = doSomething;
div 2 를 클릭 하면'div 2'가 표 시 됩 니 다.div 2 의 onclick 에 값 을 부여 하고 doSomething 을 한 번 복 사 했 기 때 문 입 니 다.이때 복 사 된 이 함 수 는 div 2 에 속 합 니 다.window 에 속 하 는 doSomething 과 아무런 관계 가 없습니다.div 2 를 클릭 하면 div 2 에 속 하 는 doSomething 이 실 행 됩 니 다.여기 서 this 는 div 2 를 말 합 니 다.2.attachEvent 와 addEventListener attachEvent 는 ie 에서 이 벤트 를 연결 하 는 방법 으로 해당 함 수 를 전역 으로 복사 합 니 다(즉,응답 함수 의 owner 는 window).그러나 DOM 표준 에서 addEventListener 가 연 결 된 이벤트 에 복사 한 응답 함수 의 owner 는 이벤트 에 연 결 된 대상 입 니 다
 
function doSomething(){
alert(this.id);
alert(this == window);
}
window.onload = function(){
var div1 = document.getElementById("div1");
if(div1.attachEvent){
div1.attachEvent("onclick",doSomething);
document.body.appendChild(document.createTextNode("attachEvent"));
}else if(div1.addEventListener){
div1.addEventListener("click",doSomething,false);
document.body.appendChild(document.createTextNode("addEventListener"));
}else{
div.onclick = doSomething;
}
}
함수 doSomething
 
function doSomething(){
alert(this.id);
alert(this == window);
}
1.attach Event 를 사용 하여 div 1 의 click 이벤트 에 연결 하면 doSometing 은 window 로 복 사 됩 니 다.이때 doSomething 안의 this 는 window 를 말 합 니 다.div 1 을 클릭 하면"undefined"와"true"2 가 표시 되 고 addEvent Listener 를 사용 하여 div 1 의 click 이 벤트 를 연결 합 니 다.이때 doSomething 을 복사 합 니 다.이 복사 후의 함 수 는 div 1 에 속 합 니 다.그래서 div 1 을 누 르 면'div 1'과'false'주석 이 표 시 됩 니 다.http://www.quirksmode.org/js/this.htmlattachEvent 는 함수 의 인용 만 사용 했다 고 생각 합 니 다.다음 코드 를 보 세 요.그러나 실제로 여기 this 는 window 를 말 하기 때문에 인용 이 아니 라 전체 로 복사 한 것 이 라 고 생각 합 니 다.3.대상 사칭 에 대한 계승 방식 1.new 와 new 의 차 이 는 다음 과 같은 function
 
var obj = new Object();
obj.color = "black";
obj.showColor = function(){
alert(this.color);
alert(this == window);
}
obj.showColor();

var div1 = document.getElementById("div1");
div1.attachEvent("onclick",obj.showColor);
이것 은 하나의 클래스 입 니까?하나의 함수 입 니까?네 마음대로 해라!만약 당신 이 이것 이 함수 라 고 생각한다 면,우 리 는 이렇게 그것 을 호출 할 수 있 습 니 다:ClassA("red");"red'는 전달 하 는 매개 변수 입 니 다.ClassA 에서 this 는 당연히 window 를 말 합 니 다.그래서 현재 window 는 color 속성 과 sayColor 방법 이 있 고 color 는'red'라 는 값 이 있 습 니 다.이것 은 sayColor 나 window.sayColor 를 호출 하면"red"를 표시 할 수 있 습 니 다.window.sayColor(); 만약 당신 이 이것 이 클래스 라 고 생각한다 면,우 리 는 그것 을 이렇게 사용 해 야 합 니 다:var obj=new ClassA("red").new 라 는 키워드 의 등장 으로 위 코드 에 많은 내용 이 추가 되 었 습 니 다.우선,Object 인 스 턴 스 를 만 든 다음,ClassA 의 this 지향 으로 만 든 이 Object 에서 마지막 으로 이 Object 로 돌아 가기 때문에 돌아 온 이 Object 는 obj 에 값 을 부여 합 니 다.그래서 this 가 가리 키 는 것 은 obj 라 고 할 수 있 습 니 다.obj 는 color 속성 과 sayColor 방법 을 가지 고 있 으 며 color 속성 값 은'red'입 니 다.2.함수 의 owener
 
function ClassA(sColor){
this.color = sColor;
this.sayColor = function(){
alert(this.color);
}
}
우 리 는 showId 라 는 함 수 를 click 이벤트 에 할당 할 수도 있 고 대상 의 모든 속성 에 할당 할 수도 있 습 니 다.이것 은 showId 라 는 방법 을 복사 할 수도 있 습 니 다.그래서 div1.show 방법 을 호출 할 때 this 는 div1 을 가리 키 고 obj.show 를 호출 할 때 this 는 obj 를 가리 키 고 있 습 니 다.3.대상 사칭 의 원리 아래 의 코드 는 대상 사칭 방법 을 통 해 이 루어 진 계승 입 니 다
 
function showId(){
alert(this.id);
}
window.onload = function(){
var div1 = document.getElementById("div1");
div1.onclick = showId;
div1.show = showId;
div1.show();

var obj = new Object();
obj.id = "obj";
obj.show = showId;
obj.show();
}
obj B 는 ClassB 의 인 스 턴 스 입 니 다.obj B 는 어떻게 color 속성 과 sayColor 방법 을 가지 고 있 습 니까?먼저 실례 화 된 코드 를 보면 var obj B=new ClassB("color of obj B","name of obj B");여기 서 ClassB 는 클래스 입 니 다.ClassB 중의 this 는 당연히 obdb 라 는 대상 을 말 합 니 다.ClassB 에서 앞의 세 줄 코드 는 ClassA 를 사용 합 니 다.이 때 ClassA 를 클래스 가 아 닌 함수 로 봅 니 다.우리 가 ClassA 라 는 함 수 를 직접 호출 하면 ClassA 의 this 가 window 대상 을 가리 키 는 것 이 분명 합 니 다.그래서 우 리 는 먼저 ClassA 를 obdb 의 new Method 라 는 속성(this.new Method=ClassA)에 복사 한 다음 에 this.new Method 를 호출 합 니 다.이것 은 이 방법의 owener 가 분명히 this 가 되 었 습 니 다.ClassB 의 this 는 현재 object B 를 가리 키 고 있 습 니 다.그래서 이때 ClassA 에서(엄 밀 히 말 하면 new Method 에서 이것 은 복사 한 것 이기 때문에 ClassA 와 이미 두 가지 방법 이 되 었 습 니 다)this 는 obdb 를 말 합 니 다.이렇게 new Method 호출 을 통 해 obdb 에 color 속성 과 sayColor 방법 을 부여 합 니 다.콜 과 apply 방법 으로 계승 을 실현 하 는 것 도 사실상 하나의 원리 이다.콜 과 apply 는 방법 을 바 꾸 는 owner 의 방법 으로 볼 수 있 는데 여기 서 ClassB 의 앞의 세 마디 코드 가 바로 이 역할 을 한다.4.prototype 1.6 의 Class.create
 
function ClassA(sColor){
this.color = sColor;
this.sayColor = function(){
alert(this.color);
}
}

function ClassB(sColor,sName){
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;

this.name = sName;
this.sayName = function(){
alert(this.name);
}
}

var objB = new ClassB("color of objB","name of objB");
objB.sayColor();
사용 할 때 이 렇 습 니 다
 
prototype1.6 Class.create :

var Class = {
create: function() {
//

function klass() {
this.initialize.apply(this, arguments);
}

//

for (var i = 0; i < properties.length; i++)
klass.addMethods(properties[i]);

//

return klass;
}
};
Person 은 실제 적 으로 Class.create 라 는 방법 을 통 해 돌아 온 klass(klass 는 Class.create 의 부분 변수 이 고 function)입 니 다.Class.create 가 전달 하 는 매개 변수(initialize 방법 과 say 방법)는 create 방법 중의 properties 배열 에 전달 되 고 addMethods 방법 을 통 해 klass 의 prototype 에 이러한 방법 을 가지 게 합 니 다.그렇다면 가장 중요 한 것 도 가장 이해 하기 어 려 운 점 은 클 라 스 의 this 가 무엇 을 말 하 는 지 하 는 것 이다.곰 곰 이 생각해 보면 답 을 얻 기 어렵 지 않다.Person 은 사실상 klass 이다.우 리 는 Person 대상 을 실례 화 할 때 new 키 워드 를 사용 했다.var a Person=new Person("name 1").이것 은 var aPerson=new klass(name 1)와 같 습 니 다.klass 는 밖에서 접근 할 수 없 지만 문 제 를 쉽게 설명 할 수 있 습 니 다.klass 는 간단 한 함수 가 아 닌 클래스 입 니 다.(우 리 는 이렇게 생각 합 니 다.new 키 워드 를 사 용 했 기 때 문 입 니 다)그러면 klass 중의 this 는 성명 의 인 스 턴 스 를 말 합 니 다.여기 서 바로 aPerson 입 니 다.aPerson 은 klass 의 prototype 을 통 해 initialize 방법 과 say 방법 을 가 질 수 있 습 니 다.new 과정 에서 klass 의 코드 도 실행 되 기 때문에 initialize 는 실례 화 될 때 구조 함수 가 실 행 됩 니 다.(klass 에서 두 개의 this 는 모두 aPerson 을 가리 키 는데 왜 apply 를 통 해 한 번 호출 해 야 합 니까?이것 은 주로 구조 함수 의 인 자 를 전달 하기 위해 apply 방법 으로 수량 이 정 해 지지 않 은 여러 개의 인 자 를 배열 을 통 해 initialize 방법 으로 편리 하 게 전달 할 수 있 습 니 다.)5.몇 가지 예 를 들 어 다른 글 에서 본 예 를 분석 해 보 겠 습 니 다.저 는 여기 서 분석 해 보 겠 습 니 다.1.다음 코드 를 실행 합 니 다
 
var Person = Class.create({
initialize:function(name){
this.name = name;
},
say:function(message){
alert(this.name + ":" + message);
}
});

var aPerson = new Person("name1");
aPerson.say("hello1");
보 여 준 결 과 는'Inner Name,Outer Name'OuterFoo 는 함수(클래스 가 아 닌)입 니 다.그러면 첫 번 째 this.Name='Outer Name'입 니 다.이 중 this 는 window 대상 을 말 하 므 로 OuterFoo()이후 window.Name='Outer Name';또한 InnerFoo 를 되 돌려 줍 니 다.이때 InnerFoo 역시 하나의 함수(클래스 가 아 님)입 니 다.InnerFoo 를 실행 할 때 this 는 window 를 가리 키 기 때문에 InnerFoo 의 this.Name 의 값 은'Outer Name'(window.Name 은 중간 역 의 역할 을 하여 OuterFoo 가 InnerFoo 에 게'Outer Name'이라는 값 을 전달 할 수 있 도록 합 니 다)이 고 Name 의 값 은 부분 변수 인 Inner Name 2 입 니 다.다음 코드 를 실행 합 니 다
 
function OuterFoo(){
this.Name = 'Outer Name';

function InnerFoo(){
var Name = 'Inner Name';
alert(Name + ', ' + this.Name);
}
return InnerFoo;
}
OuterFoo()();
"division element"를 누 르 면"undefined"가 표 시 됩 니 다.ie 아래 에"true"가 표시 되 고 다른 브 라 우 저 에 서 는"false"가 표 시 됩 니 다.인 스 턴 스 성명 과 인 스 턴 스 호출 방법 은 말 할 것 이 없습니다.요소 의 click 이벤트 가 인 스 턴 스 로 연결 되 었 습 니 다.그러면 addEventListener 를 통 해 연결 되 는 방법 은 복사 한 것 입 니 다.그래서 this 는 html 요 소 를 말 합 니 다.이 요 소 는 m 가 없습니다.텍스트 속성(mText 속성 은 JSclass 의 인 스 턴 스,즉 jc 에 속 하 는)이기 때문에 요 소 를 누 르 면 undefined 를 표시 하고 attachEvent 바 인 딩 된 이 벤트 는 함 수 를 전역 으로 복사 합 니 다.이때 this 는 window 대상 을 가리 키 며 요 소 를 누 르 면'undefined'를 표시 합 니 다.jc.ToString()을 호출 하 는 방법 만 있 습 니 다.this 는 jc 라 는 대상 을 말 합 니 다.jc 는 m 를 가지 고 있 기 때 문 입 니 다.Text,그래서"division element"를 표시 할 수 있 습 니 다.6.어떻게 코드 환경 에서 this 가 가리 키 는 대상 을 신속하게 찾 을 수 있 습 니까?저 는 다음 과 같은 세 가지 측면 에 주의 하고 싶 습 니 다.1.함수 에 대한 모든 작업 이 복사 인지 인용 인지 2.함수 의 소유자(owner)가 무엇 인지 잘 알 아야 합 니 다.3.하나의 function 에 대해우 리 는 그것 을 함수 로 사용 하 는 지,클래스 로 사용 하 는 지 알 아야 합 니 다.보충:1.인 스 턴 스 와 클래스 에서 함 수 를 직접 정의 할 수 있 습 니 다.2.인 스 턴 스 에서 prototype 정의 함 수 를 사용 할 수 없습니다.클래스 에서 만 prototype 정의 함수 3.클래스 에서 직접 정의 하 는 함 수 는 this 방문 대상 의 속성 4 를 사용 할 수 없습니다.클래스 의 prototype 에서 만 든 함 수 는 this 를 사용 할 수 있 습 니 다.클래스 내부 에서 정 의 된 함 수 는 this 를 사용 할 수 있 습 니 다.대상 인 스 턴 스 에서 만 든 함수 액 은 this
 
function JSClass(){

this.m_Text = 'division element';
this.m_Element = document.createElement('DIV');
this.m_Element.innerHTML = this.m_Text;

if(this.m_Element.attachEvent)
this.m_Element.attachEvent('onclick', this.ToString);
else if(this.m_Element.addEventListener)
this.m_Element.addEventListener('click', this.ToString,false);
else
this.m_Element.onclick = this.ToString;
}

JSClass.prototype.Render = function(){
document.body.appendChild(this.m_Element);
}

JSClass.prototype.ToString = function(){
alert(this.m_Text);
alert(this == window);
}

window.onload = function(){
var jc = new JSClass();
jc.Render();
jc.ToString();
}
javascript this 용법 소결https://www.jb51.net/article/16863.htm
JavaScript this deep understandhttps://www.jb51.net/article/19425.htm
JAVASCRIPT THIS 상세 대상https://www.jb51.net/article/17584.htm
Javascript 이 지침https://www.jb51.net/article/19434.htm
JavaScript 에서 this 키워드 사용 방법 에 대한 상세 한 설명https://www.jb51.net/article/7954.htm

좋은 웹페이지 즐겨찾기