Diberikan file input seperti
import { a } from 'b';
function x () {
a()
}
babel akan mengkompilasinya menjadi
'use strict';
var _b = require('b');
function x() {
(0, _b.a)();
}
tetapi ketika dikompilasi dalam mode longgar panggilan fungsi adalah keluaran sebagai _b.a();
Saya telah melakukan beberapa penelitian di mana operator koma ditambahkan dengan harapan ada komentar yang menjelaskannya. Kode yang bertanggung jawab untuk menambahkannya ada di sini .
javascript
ecmascript-6
babeljs
Will Smith
sumber
sumber
_b.a.call()
agar niatnya jelas.Jawaban:
(0, _b.a)()
memastikan bahwa fungsi_b.a
dipanggil denganthis
set ke objek global (atau jika mode ketat diaktifkan, keundefined
). Jika Anda menelepon_b.a()
secara langsung, maka_b.a
dipanggil denganthis
set ke_b
.(0, _b.a)();
setara dengan(
,
adalah operator koma, lihat https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator ).sumber
var _a = (0, _b.a)
di bagian atas file dan kemudian menelepon_a
akan menghemat lebih banyak ruang dalam banyak kasus, ada ide mereka tidak melakukan itu?_b.a
pengambil (dinamis).this === undefined
dan Anda bahkan tidak perlu menyebutkan objek globalJadi, mari kita lihat contoh:
Sekarang, dalam
foo
metode,this
sama dengana
(karenafoo
dilampirkan kea
). Jadi jika Anda memanggila.foo(
) secara langsung, itu akan masukfalse
ke konsol.Tapi, jika Anda dipanggil
(0, a.foo)()
. Ekspresi ini(0, a.foo)
akan mengevaluasi setiap operannya (dari kiri ke kanan) dan mengembalikan nilai dari operan terakhir. Dengan kata lain,(0, a.foo)
setara denganKarena fungsi ini tidak lagi melekat pada apa pun, ini
this
adalah objek globalwindow
. Itu sebabnya masuktrue
konsol saat panggilan(0, a.foo)()
.sumber
console.log(this === window);
di konsol dev tidak mencetak log lagi.