`function`에서 Javascript`new`의 이상한 동작 [duplicate]

Oct 15 2020

정말 놀라운 일이 생겼어요. 다음 네 가지 기능을 고려하십시오.

function A() {
 this.q = 1;
}

function B() {
 this.q = 1;
 return this;
}

function C() {
 this.q = 1;
 return 42;
}

function D() {
 this.q = 1;
 return {};
}

그리고 new그들 모두로부터 (를 통해 ) 객체를 만들어 봅시다 :

console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());

다음은 출력입니다.

a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}

처음 세 가지는 함수가 반환하는 것이 중요하지 않다는 것을 나타내는 것 같습니다. JS는 각 함수가 수행하는 작업에만 관심 this이 있습니다. 그러나 마지막 것은 그것과 모순됩니다.

그래서 여기서 무슨 일이 일어나고 있습니까? 수정 된 규칙은 "함수가를 반환하면 Object그대로 유지합니다. 그렇지 않으면 유지합니다. this" 그러나 나는 그것에 대해 꽤 확신이 없습니다.

답변

1 Lorand Oct 16 2020 at 02:51

당신이 사용하는 경우 연산자는 객체를 생성합니다.

반환 값은 예상대로입니다. 반환에서 객체는 해당 객체를 반환하고 그렇지 않으면 반환이 함수이면 해당 함수를 반환합니다.

function A(){
    this.b = 3;
    return function(){return 4;};
}
function B(){
    this.b = 3;
    return { d:4};
}

console.log(typeof (new A())); //function
console.log(typeof (new B())); //object {d:4}

반환에 다른 값이 있거나 존재하지 않는 경우이 연산자는 객체로 반환 된 우선 순위를 갖습니다.

function C(){
    this.b = 3;
    return "78";
}
console.log(typeof (new C())); // object {b:3}
3 Harkal Oct 16 2020 at 02:40

JavaScript에서 함수를 test()실행하는 것처럼 new없이 함수를 호출 할 때 . 함수가 반환하는 모든 것을 반환합니다.

new와 같이 함수를 호출 new test()하면 return 문이 객체를 반환하고 그렇지 않으면 this객체를 반환 합니다.

그래서

function test() {
    this.q = 1
}

test(); // return undefined

new test(); // return {q:1}