2017-01-26 3 views
0

여기에 내 첫 번째 질문이므로 사과하지 않을 경우 사과드립니다. 아마 내 문제에 대한 해결책을 찾을 수 있지만, 나는 그것을 검색하는 방법, 구글이나 뭐 그런 질문을하는 방법에 대한 단서가 전혀 몰라. 자바 스크립트 생성자 및 인수

나는 다음과 같은 문제가, 내가 사용하려고 할 때의 지금과 같은 생성자

const Product = function (color) { 
    let self = {}; 

self.setColor = function(colorToSet) { 
    color = colorToSet; 
} 

self.getColor = function() { 
    return color; 
} 

return self; 
}; 

을 보자 :

let self = {}, color; 

을 나는 색상이 이미 선언되었습니다 오류가 발생 크롬 콘솔에서, 그래서 색상 필드를 제거한 후 위의 스 니펫 코드를 사용하여 설명 할 수없는 마술이 일어났습니다. 다음은 어떻게 든 선언되어야한다, 그것은 처음으로 색상을 반환하는 경우

let a = Product("Yello"); 
a.getColor() ----> "Yellow" 
a.setColor("red"); 
a.getColor() ----> "red"; 

:

이의 나는 이런 식으로 뭔가를 쓸 것입니다 가정 해 봅시다. 컬러 필드가 어디에 있는지 모르겠지만 실제로는 찾을 수 없으며 실제로 프로토 타입에서도 찾을 수 없습니다. 이유를 설명해 주시겠습니까? 그리고 그것은 어디에 있습니까?

예를 들어 색상을 선언 할 수 있다는 것을 알고 있습니다. self.color = color; 하지만 위의 예제가 어떻게 작동하고 색상 영역에서 어떤 일이 발생했는지 알고 싶습니다.

또한 매개 변수에서 값을 선언하는 데 let을 사용할 수 있는지 알려주시겠습니까?

const Product = function (color) { 
let self = {}, color; 

self.setColor = function(colorToSet) { 
    color = colorToSet; 
} 

self.getColor = function() { 
    return color; 
} 

return self; 
}; 
+0

Afaik,'color' 만 사용하면'window' 객체에 추가됩니다. 실제로'window.color'를 가져 오거나 설정하고 있습니다. –

+0

@Chris G : 색상이 '창'에 정의되어 있지 않습니다. ** 클로저입니다 ** 동작입니다. – Pineda

답변

0

그것은 마술이 아니다 :) 때문에이 문제가 발생합니다 당신은 closures을 두 가지 방법을 가진 개체를 반환하고

. 함수는 다른 함수 내에 정의하고 (당신이 다음 self 변수 부착이 돌아온 경우) 어딘가에 저장하는 기준은 다음 closure가 생성

.

간단히 말해서 함수는 정의 블록 내부와 그 둘러싸는 환경 (생성자 정의)에 생성 된 변수에 액세스 할 수 있습니다.

결과적으로 부모가 호출 될 때 엔 클로징 범위의 모든 변수에 액세스 할 수 있습니다.

여기에는 제품 기능을 둘러싸고있는 매개 변수 (예 : 정의한 color 인수)가 포함됩니다.

그래서 :

  • 당신은 색상을 전달 제품을 호출하고 변수 a이를 저장합니다. 이 시점에서 A는 등록 두 방법 getColor 등을 포함 할 개체에 대한 참조를 포함 할 것이다 setColor

  • 후자의 방법이 폐쇄가되어 있기 때문에, 그들은 시간이 제품에 동봉 한 범위에 대한 액세스 권한 (그들의 바깥 함수 환경 불렸다) .제품은 색상으로 호출 된 이후, 변수는 제품에 지역 color라고하지만 은 어떤 폐쇄에 사용할 생성 및 전달 된 값이 할당됩니다.이 경우 color 모두 이후 노란색

  • '와 동일합니다 메소드가 동시에 동일한 범위에서 정의 된 경우이 메소드는이 변수에 액세스하여 사용자가 경험 한 결과를 산출합니다.

0

그것은 어떻게 든 선언해야합니다. 색상 영역이 어디인지는 모르지만 실제로는 아무 것도 찾을 수 없습니다. 이유를 설명해 주시겠습니까? 그리고 그것은 어디에 있습니까?

매개 변수 이름으로 사용하여 선언 한 변수입니다. 이 매개 변수 변수는 Product 함수로 범위가 지정됩니다. 즉, 내부의 모든 위치에서 사용할 수 있습니다. let color을 사용하려고하면 "이미 선언 됨"오류가 발생합니다.

closures이기 때문에 메서드가이 로컬 변수에 액세스 (읽기/쓰기) 할 수 있습니다.