2012-08-14 2 views
5

내부,이 사람은 나를 위해 더 정확 :"VAR"변수는, "이"변수와 "글로벌"변수 - 내 마지막 질문 후 자바 스크립트 생성자

예 :

function Foo() { 
    this.bla = 1; 
    var blabla = 10; 
    blablabla = 100; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 
foo = new Foo(); 

내가 지금 이해 :

this.bla = 1;  // will become an attribute of every instance of FOO. 
var blabla = 10; // will become a local variable of Foo(will **not** become an attribute of every instance of FOO), which could be accessed by any instance of FOO - only if there's a method like "this.getBlabla". that's a "closer" ? 
blablabla = 100; // will define a **new** (or change if exist) global(window) variable. 

정확하게 이해합니까?

또한 계약자에서 사용하는 var blabla = 10;getblabla 함수를 포함하면 Foo ("foo"...)의 모든 인스턴스에 대해 Foo 계약자 함수가이 함수를 포함하는 메모리에 저장됩니다 "개인"변수. 아니면 Foo의 ALL 인스턴스 (예 : "foo")에 대해 사적인 변수를위한 장소와 동일한 Foo 함수가 될 것입니까?

+0

첫 번째 3 가지 주장이 정확합니다. 나는 당신이 당신의 마지막 질문을 요구하는 것을 완전히 따르지 않습니다. 당신은 명확히 할 수 있습니까?비슷한 이름의 변수도 시도해 볼 수 있습니까? 따르기가 어렵습니다. 감사. – Brad

+0

그것은 나에게도 복잡합니다. 내말은 ... 폐쇄 겠지? 그리고 그것은 계약자입니다 - 그래서 Foo의 모든 인스턴스에 대해 Foo의 새로운 클로저가 메모리에있을 것입니까? 이 물건들은 어떻게 작동합니까? 감사. – Daniel

답변

6

을 변수) 그런 다음 다시 변수에 연결합니다.

var x = "Global scope"; 
var y = "Not changed."; 

function Foo() { 
    this.x = "Attribute of foo"; 
    var x = "In foo's closure"; 
    y = "Changed!" 
    this.getX = function() { 
     return x; 
    } 
} 

// do some logging 

console.log(x); // "Global scope" 
console.log(y); // "Not changed" 
foo = new Foo(); 
console.log(y); // "Changed!" 
console.log(foo.x); // "Attribute of foo" 
console.log(x); // "Global scope" 
console.log(foo.getX()); // "In foo's closure" 

라인 : this.xthis.bla가 동등하고,이 Foo 물체의 외부 가능한 특성을 정의한다. yblablabla=100과 같고 foo의 x은 foo의 blablabla과 같습니다. 여기 정말 거친 jsfiddle이 있습니다.

1

예, 이해했습니다.
질문의 두 번째 부분은 (글로벌) 창과 범위에 정의 된 함수 (루트라고 생각하는 함수)와의 관계와 마찬가지로 상속에 관한 것입니다. 당신이 다시 지정하지 않는 모든 것이 조상을 쳐다볼 것입니다.

이것은 Crockford의 tremendous good video이며, 실제로 설명합니다.

2

당신이 말한 것은 모두 정확합니다. (물론 할당에서 오류가 발생합니다.

두 번째 절반에는 생성자 함수에 특별한 것이 없습니다. 다른 함수처럼 작동하며, 오래 지속되는 클로저를 만듭니다. . 참조 된 (이 경우 this.getblabla의 수명)으로

이 예를 보자는 Foo 생성자는 클로저를 형성하지 않는다 여기

function initBlaBla() { 
    var blabla = 10; 
    this.getblabla = function() { 
     return blabla; // exposes blabla outside 
    } 
} 

function Foo() { 
    this.bla = 1; 
    blablabla = 100; 
    initBlaBla.call(this); 
} 

foo = new Foo(); 

및 그 범위는 즉시 해제됩니다 initBlaBla을 다른 한편으로. 한 d가 클로저를 만듭니다. 흥미롭게도 컴파일러는 blabla가 쓰여지지 않고 항상 this.getblabla을 최적화하여 항상 10을 반환하고 클로저 범위를 저장하지 않을 수도 있음을 알 수 있습니다. 이것은 클로저 내부의 함수에서 실행을 중단하고 내부적으로 참조하지 않는 값을 읽으려고 할 때 나타납니다.

폐쇄의 범위는 발표 얻을 것이다 당신은 다음 중 하나를 호출하는 경우 가비지 컬렉션을 위해 대기 : 나는 명확와 (이 예제를 실행하는거야 그냥 범위에 초점을

delete foo.getblabla; 
foo.getblabla = "Anything!"; 
foo = "Anything else.";