2014-08-31 1 views
1

자바 스크립트 초보자는이 코드 블록이 의미가 없습니다.Javascript 클래스, 인스턴스화 후이 var에 액세스 할 수있는 이유는 무엇입니까?

function Warrior(n){ 
var name = n; 
this.name = function(n){ 
    if(n) name=n; 
    return name; 
    } 
} 

Warrior.prototype.toString = function(){ 
    return "Hi! my name's "+this.name(); 
} 

왜하지 var name 클래스가 구성되어 직후 죽을 ... 이름 함수를 호출, 문자열 작품 전사의 인스턴스를 사용하거나 PARAMS없이 작동 변환? 왜 그렇게 느껴지나요? vars가 남아 있으면 this을 사용해야하는 이유는 무엇입니까?

+0

자바 스크립트이므로 –

+2

[Javascript 클로저는 어떻게 작동합니까?] (http://stackoverflow.com/questions/111102/how-do-javascript-closures-work/111200#111200)를 읽어보십시오. 그것은 그것 모두를 설명 할 것이다. – jfriend00

+0

또한'Warrior()'생성자에서'this.name'과'var name'은 완전히 다른 변수입니다. 'var name'은 생성자 함수의 지역 변수이고'this.name'은 새로 생성 된 객체의 속성입니다. – jfriend00

답변

1

모든 함수는 자체 범위에 변수를 만들고 해당 범위 또는 포함 된 범위의 변수에 액세스 할 수 있습니다. 어떤 식 으로든 변수에 여전히 액세스 할 수있는 경우 변수는 여전히 존재하며 내부 함수는 변수에 액세스 할 수있는 한 가지 방법입니다. 문제는 접근 가능한 변수에 접근 할 수있는 함수를 만드는 방법이다. 이는 this을 통해 수행 할 수 있습니다. 여기있어.

1

클래스가 생성 된 직후에 var 이름이 죽지 않아야합니까?

아니, name 변수 요구 this.name 기능에 의해 노출 된 Closure로 사용할 수 있습니다.

vars가 그대로 있으면 왜 사용하나요?

JavaScript에서 this은 공개 된 메서드와 데이터를 구성된 개체의 속성으로 노출하는 데 사용됩니다. 변수 (var 키워드로 선언)는 Closure에 노출되지 않는 한 함수의 내부에 있습니다 (귀하의 경우와 동일).

또한 JavaScript에는 '클래스'와 같은 것이 없습니다. 객체가 있지만 구조와 상속은 함수 스타일과 프로토 타입 상속을 사용하여 정의됩니다.

Introduction to Object-Oriented JavaScript을 참조하십시오.

0

개체가 여전히 사용하지 않는 한 변수는 으로 죽습니다. 클로저를 만드는 방법에는 여러 가지가 있습니다.

함수에서 "this"는 호출 함수 (기본적으로 윈도우 객체)를 가리 킵니다. 새로운 생성자가 사용되지 않는 한.

thisObject = new Warrior("hello"); 

새 thisObject를 가리 킵니다.

내부 함수 내에서 전역 없음을 가리키는 데 사용할 수 있습니다 (그러면 호출 함수 네임 스페이스를 가리 킵니다). 그러면 private n 변수를 유지하는 함수가 반환됩니다.

myobject = Warrior("hello"); 

그러나 부분 코드가 나타내는 방법은 아닙니다.

function Warrior(n){ 
var name = n; 
alert(this); 
this.name = function(n){ 
    if(n) name=n; 
    return name; 
    } 
} 
Warrior("hello"); 
window.alert(name); 

아래 알림을 참조하십시오.enter image description here

myObject = new Warrior("name"); 

enter image description here

은 예 클로저 함수를 만들 것입니다. MyObject가됩니다.

+0

경고 ??? console.log는 IE를 사용하지 않는 경우 훨씬 많은 정보를 제공합니다. – HMR

관련 문제