2009-12-09 5 views
0

괴짜, IE에서

나는 다음과 같은 코드 한을 오버라이드 (override)됩니다 스 니펫 A에서 y, B에서 y?

답변

2

스 니펫 A에서 x 및 y에 대해 this 키워드는 전역 개체를 참조하므로 값을 동일한 전역 변수 (window.id)로 설정하면됩니다.

스 니펫 B에서는 new 연산자를 사용하고 있으며 함수는 생성자 함수로 실행되며 this 키워드는 새로 만든 개체를 참조합니다.

당신의 조각 A의 그 동작을 방지하려면 새 개체 인스턴스를 생성하고 this 대신 사용할 수 있습니다 : 그들은 전역 객체의 멤버이기 때문에 당신이 전역 함수를 호출

var x = (function(){ 
    var instance = {}; 
    instance.id = "Dog"; 
    return instance; 
}()); 

var y = (function(){ 
    var instance = {}; 
    instance.id = "Cat"; 
    return instance; 
}()); 

alert(x.id); //outputs Dog 
alert(y.id); //outputs Cat 

:

window.globalFunction(); 

A :

globalFunction(); 

은 동일합니다 그 함수 내부의 컨텍스트는 전역 객체 자체 (window)가됩니다.

+0

+1 좋은 답변 –

3

둘 사이의 차이는 단편 A는 아니지만 발췌문 B는 상기 new 키워드 호 붙임하여 constructor function을 사용하고 있다는 것이다. 이것은 짧은 대답입니다.

긴 대답은하지그것은 this 변수 단순히 글로벌 window 객체를 가리키는 것 생성자 컨텍스트에서 사용하기 때문에 조각 A는 각 익명 함수 호출에 새로운 범위를 도입하더라도 있다는 것입니다. 따라서 스 니펫 A는 다음과 같습니다.

var x = (function(){ window.id="Dog"; return window; }()); 
var y = (function(){ window.id="Cat"; return window; }()); 

따라서 각 호출은 동일한 [전역] 변수를 마비시킵니다.

스 니펫 B는 new 키워드를 사용하므로 생성자 함수를 정의하고 즉시 호출합니다. JavaScript는 생성자 함수 내에서 this 변수를 초기화하여 [정의 된] 익명 함수의 새 인스턴스를 가리 킵니다.

얼마 전에 코드 블록을 정의하고 즉시 실행하는 가장 좋은 방법은 new function(){} 관용구를 보았을 것입니다. 글쎄, 자바 스크립트 객체 인스턴스 생성의 오버 헤드가있다. (더 이상 널리 사용되지 않는다.