다음과 같은 입력 파일이 주어지면
import { a } from 'b';
function x () {
a()
}
바벨은 그것을 컴파일합니다
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
그러나 느슨한 모드에서 컴파일되면 함수 호출은 다음과 같이 출력됩니다. _b.a();
나는 그것을 설명하는 주석이 있기를 희망하면서 쉼표 연산자가 추가되는 위치에 대해 조사했습니다. 추가를 담당하는 코드는 여기에 있습니다 .
답변
(0, _b.a)()
함수 _b.a
가 this
전역 객체 로 설정된 상태에서 호출되도록 합니다 (또는 엄격 모드가 활성화 된 경우로 undefined
). _b.a()
직접 호출 하는 경우 _b.a
는로 this
설정되어 호출 됩니다 _b
.
(0, _b.a)();
다음과 같다
0; // Ignore result
var tmp = _b.a;
tmp();
( ,
쉼표 연산자 입니다. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator 참조 ).
답변
쉼표 연산자는 각 피연산자를 평가하고 (왼쪽에서 오른쪽으로) 마지막 피연산자의 값을 반환합니다.
console.log((1, 2)); // Returns 2 in console
console.log((a = b = 3, c = 4)); // Returns 4 in console
따라서 예를 보겠습니다.
var a = {
foo: function() {
console.log(this === window);
}
};
a.foo(); // Returns 'false' in console
(0, a.foo)(); // Returns 'true' in console
지금에 foo
있어서, this
동일하다 a
(하기 때문에 foo
부착된다 a
). 따라서 a.foo(
)를 직접 호출하면 false
콘솔에 로그인 됩니다.
그러나 전화했다면 (0, a.foo)()
. 표현식 (0, a.foo)
은 각 피연산자 (왼쪽에서 오른쪽으로)를 평가하고 마지막 피연산자의 값을 반환합니다. 즉, 다음 (0, a.foo)
과 같습니다.
function() {
console.log(this === window);
}
이 함수는 더 이상 아무것도 연결되지 않으므로 this
전역 객체 window
입니다. 그것이 true
호출 할 때 콘솔에 로그인 하는 이유 (0, a.foo)()
입니다.