2017-05-21 12 views
1

자바 스크립트에서 다음 코드와 혼동 스러웠습니다.IIFE를 변수에 할당 할 때 IIFE는 어떻게 작동합니까?

var x=(function(){ 
    var customObject = function(){}; 

    customObject.prototype.sayHello=function(){ 
    alert("hello"); 
    }; 

    return customObject; 
})(); 

//var y=new x();// If I uncomment this line and comment the next line "var 
//y=x;" the code works 
var y=x; 
y.sayHello(); 

이 코드는 인사하지 않지만 댓글을 제거 할 때 수행합니다. 나는 그것이 정의 된 직후에 IIFE가 실행된다는 것을 읽었다. 따라서 customObject를 x에 직접 할당해야합니다.

제 질문은 왜 안녕하세요라고 말하기 위해 x의 새 인스턴스를 만들어야하는지입니다. IIFE가 어떻게 작동하는지는 분명하지 않습니다.

이 개념을 이해하도록 도와주세요. 미리 감사드립니다 :-).

+2

IIFE는'customObject'를 반환합니다. 'customObject'는 새로운 인스턴스를 생성하기 위해'new'와 함께 호출되어야하는 생성자 함수입니다. IIFE는 그렇게하지 않을 것입니다. * "IIFE를 변수에 할당 할 때 IIFE가 어떻게 작동합니까?"* 변수에 IIFE를 할당하지 않습니다. IIFE의 * 반환 값 *을 변수에 할당합니다. IIFE는 단지 함수 호출 일뿐입니다. 특별한 것은 없습니다. –

답변

3

입니다 x 프로토 타입에 설정 방법에 액세스 할 수있을 것입니다. 그러나 customObject (따라서 x)에는 sayHello 속성이 없습니다. prototype 속성이 있고 인이sayHello 속성을 가지고 있습니다.

y=x을 누른 다음 y.sayHello()을 수행 할 때 존재하지 않는 customObject.sayHello을 호출하려고합니다.

y=new x()을 만들 때 프로토 타입이 customObject.prototype 인 개체를 만듭니다. 그런 다음 y.sayHello()으로 전화하면 프로토 타입 체인을 통해 sayHello 함수가 발견됩니다.

이것은 실제로 IIFE 사용과 관련이 없습니다. 방금 썼다면 같은 결과를 얻을 것입니다 :

IIFE 대신.

+0

정말 설명해 주셔서 고맙습니다. 정말 도움이됩니다. – APL

1

여기에 혼란스러워합니다.

처음으로인데, IIFE는 여기에서 올바르게 작업하고 있습니다. 실행하여 xcustomObject을 반환합니다.

이것은 수행 한 작업입니다. 내가 안녕하세요 말을 X의 새로운 인스턴스를 생성해야하는 이유

지금, 실제 질문에 오는?

모두 classes(functions)prototype이고 모두 variables__proto__입니다.

프로토 타입에 설정된 모든 항목은 해당 생성자의 인스턴스에 액세스 할 수 있습니다. 예를 들어

: 당신은 우리가 우리의 변수 이름에 toUpperCase()를 호출 할 수 있었다 어떻게 생각

console.log(myName.toUpperCase()) // outputs: APL

var myName = "apl"; // a simple string?

typeof(myName)string으로 밝혀졌습니다. 따라서 myNameString.prototype에 설정된 모든 속성/메소드를 호출 할 수 있습니다. 한마디로

, myName__proto__ 속성을 설정해야합니다 문자열의 prototype

myName.__proto__ === String.prototype // 사실 MyName로는 문자열의 인스턴스가

따라서, 귀하의 경우이기 때문에, 당신은 인스턴스로 y 필요 x. 그런 다음에야 당신은 결국 당신은 customObjectx에 할당하는 것이 올바른 것 customObject.prototype

+0

유익한 답변을 해주셔서 감사합니다. 그것은 나의 혼란을 지워줍니다 :-) – APL