2015-08-28 10 views
67

Babil neden içe aktarılan işlev çağrısını (0, fn) (...) olarak yeniden yazıyor?

'use strict'; 

var _b = require('b'); 

function x() { 
    (0, _b.a)(); 
} 

için

import { a } from 'b'; 

function x() { 
    a() 
} 

babel derlemeyi yapacaktır

gibi bir girdi dosyası Verilen fakat gevşek modunda derlenmiş zaman işlev çağrısı ben içine biraz araştırma yaptık _b.a();

olarak verilir virgül operatörünün umuda eklendiği yerde, bunu açıklayan bir yorum vardı. Eklemekle sorumlu kod here.

+3

Niyeti açık yapmak için _b.a.call() 'yapmalılardı. – Bergi

+0

@Bergi (0,) ile aktarılan kodda yer kazanmak için onların neden olduğundan eminim. – Andy

+2

ayrıca bkz. [Comma operatörü Javascript'te yürütme içeriğini etkiler mi?] (Http://stackoverflow.com/q/36076794/1048572) – Bergi

cevap

93

(0, _b.a)() fonksiyon _b.a genel nesneyi set this (veya katı mod etkinse, undefined kadar) ile çağrılır olmasını sağlar. doğrudan _b.a() aramaya olsaydı, _b.a_b için this seti ile çağrılır.

(0, _b.a)();

0; // Ignore result 
var tmp = _b.a; 
tmp(); 

eşdeğerdir (, virgül operatörü https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator see).

+2

Bağlantı için teşekkürler. Bu kadar çok kez geçti ve nihayet neler olduğunu bulmaya karar verdi. –

+0

@RobW Dosyanın üst kısmına 'var _a = (0, _b.a)' yazmayı düşünürdüm ve daha sonra '_a '' yi çağırmak bir çok durumda daha fazla yer kapatacaktı, herhangi bir fikir yapmadılar mı? – Andy

+1

@Andy Öneriniz yan etkileri olabilir, ör. '_b.a' (dinamik) bir alıcı olduğunda. –

9

virgül operatörü (soldan sağa) işlenenlerinden her değerlendirir ve son terimin değerini verir. (fooa bağlı olduğu için)

var a = { 
    foo: function() { 
    console.log(this === window); 
    } 
}; 

a.foo(); // Returns 'false' in console 
(0, a.foo)(); // Returns 'true' in console 

Şimdi, foo yöntemde, thisa eşittir:

console.log((1, 2)); // Returns 2 in console 
console.log((a = b = 3, c = 4)); // Returns 4 in console 

Yani, bir örnek bakalım. Doğrudan a.foo( numaralı telefonu arayacak olursanız, konsolda false oturum açacaktır.

Ama (0, a.foo)() çağrı olsaydı. (0, a.foo) ifadesi, her işlenenini (soldan sağa) değerlendirecek ve son işlenenin değerini döndürecektir. Bu işlevi artık hiçbir şeye bağlı olduğundan başka deyişle, (0, a.foo) onun this küresel nesne window olduğunu

function() { 
    console.log(this === window); 
} 

eşdeğerdir. Bu nedenle, (0, a.foo)() numaralı telefonu arayarak konsolda true'u günlüğe kaydeder.

İlgili konular