2015-06-24 18 views
6

Vì không có trình duyệt Tôi biết cụ hiện giao diện module ES6 - nhưng transpilers làm - Tôi đã thử nghiệm babel với ví dụ đơn giản nàynhập khẩu hài hước Babel của

import { getUsefulContents } from "file.js"; 
getUsefulContents("http://www.example.com", data => { 
    doSomethingUseful(data); 
    }); 

Tôi chỉ muốn nhìn thấy như thế nào transpile những dòng này. Trước sự ngạc nhiên của tôi, nó được sản xuất sau khi xuất:

"use strict"; 

var _fileJs = require("file.js"); 

(0, _fileJs.getUsefulContents)("http://www.example.com", function (data) { 
    doSomethingUseful(data); 
}); 

Dòng cuối cùng trông bí ẩn với tôi - đặc biệt là phần (0, _fileJs.getUsefulContents), điều gì đang diễn ra ở đó? Mục đích của số (0, ...) trên dòng đó là gì?

Trả lời

9

Gọi một hàm giống như vậy sẽ buộc nó gọi nó trong ngữ cảnh chung.

function whoAmI() { 
 
    document.querySelector('pre').innerText += this.name + '\n'; 
 
} 
 
window.name = 'window'; 
 
var mike = { 
 
    name: 'mike', 
 
    whoAmI: whoAmI 
 
}; 
 
mike.whoAmI(); 
 
(0, mike.whoAmI)();
<pre></pre>

Lý do làm việc này là bởi vì khi đánh giá (0, filesJs) nó chạy qua từng câu lệnh trong ngoặc đơn, tương tự như cách bạn có thể khai báo nhiều biến sử dụng một ,

var a = 1, 
    b = 2, 
    ... 

Khi biểu thức cuối cùng là tham chiếu đến một hàm, nó sử dụng hàm đó khi đánh giá cuộc gọi hàm với bộ ngoặc đơn tiếp theo. Khi biểu thức đã được đánh giá, bối cảnh _filesJs bị mất. Nó có hiệu quả giống như thực hiện việc này:

0; // Legal, just pointless 
var f = _filesJs.getUsefulContents; 
f("http://example.com", ...); 
+0

wow, thật tuyệt vời :) - cảm ơn bạn đã trả lời, tốt để biết –

+1

Nó không hoạt động trong chế độ '' sử dụng nghiêm ngặt '; '. –

+0

@NinaScholz điểm tốt và lý do tại sao nó đã được sử dụng là cho tôi vẫn chưa rõ ràng –

Các vấn đề liên quan