2015-10-06 14 views
6

Nếu tôi cóCó phải yêu cầu IIFE xung quanh lớp học trong ECMAScript/Javascript 6 không?

Class Car {} 

tôi có cần phải đóng bằng chức năng đóng của mình không? Do var's được treo lên cửa sổ? hoặc chỉ đến lớp học? Điều gì về khi transpiled? Traceur/babel biến nó thành một IIFE và chúng ta hãy vào var's?

Tôi có cần phải:

(function(){ 
    Class Car() {} 
}()); 

Để được an toàn?

+1

Điều đó phụ thuộc vào việc bạn đang tải tệp dưới dạng tập lệnh hay mô-đun. Bạn đang tải tệp như thế nào? – loganfsmyth

+0

Natively, đó là một câu hỏi thực sự tốt. Thử nghiệm ở đây với Edge và mặc dù tôi có thể có tệp 'car.js' với khai báo lớp đó và tệp' new-car.js' sử dụng lớp đó, nếu tôi đăng nhập 'Car' vào bảng điều khiển, nó sẽ hiển thị cho tôi constructor, nhưng nếu tôi đăng nhập 'window.Car', nó sẽ hiển thị' undefined'. – Buzinas

+0

@Buzinas: Đó là một chút khác biệt. Các khai báo chính xác ('class',' let' và 'const') không trở thành thuộc tính của đối tượng chung. –

Trả lời

1

Bạn có thể có một cái nhìn vào những gì sẽ xảy ra khi Babel transpiles mã của bạn here

Bạn không cần phải sử dụng một IIFE trừ khi bạn muốn ẩn lớp, và var Class đó được tạo ra được kéo lên như bất kỳ biến nào: tuyên bố sẽ diễn ra ngay từ đầu, nhưng việc gán sẽ diễn ra trong dòng ban đầu.

Và có, Babel chuyển thành thành var, nhưng nó cũng đảm nhận phạm vi chăm sóc hoạt động như mong đợi với các hiệu ứng phụ. Nếu bạn chỉ muốn viết mã ES6 và thực hiện nó, bạn không cần phải lo lắng về những chi tiết này, chỉ cần làm theo các tiêu chuẩn ES6 (ES2015).

1

Không, không cần phải bọc nó như thế miễn là mã đang được coi là mô-đun ES6. Cài đặt mặc định của Babel xử lý mã đầu vào và tệp dưới dạng mô-đun. Babel giới thiệu các chức năng ở những nơi khác nhau để thực hiện các ngữ nghĩa phạm vi chính xác và biến đổi let thành var nếu bạn đã bật biến áp thích hợp.

module ES6 luôn trong chế độ nghiêm ngặt và đây là những gì spec nói về nhiệm vụ trong chế độ nghiêm ngặt:

Chuyển nhượng đến một định không khai báo hoặc tài liệu tham khảo khác không thể giải quyết không tạo ra một tài sản trong đối tượng toàn cầu. Khi một phép gán đơn giản xảy ra trong mã chế độ nghiêm ngặt, LeftHandSide của nó không được đánh giá đến một tham chiếu không thể giải quyết được.

http://www.ecma-international.org/ecma-262/6.0/#sec-strict-mode-of-ecmascript

Chính xác những gì bạn có ý nghĩa gì bởi ?:

Do var của bị kéo lên tới [...] lớp?

2

Không cần phải là trình bao bọc IIFE cho lớp học như được hiển thị ở đây, trên thực tế sẽ tạo ngữ cảnh thực thi và ẩn lớp đó khỏi phần còn lại của trang.

Vì vậy, bạn sẽ chỉ để lại nó như (không phải là chữ thường)

class Car(){} 

Var vẫn kéo lên theo cách tương tự trước đó. Nó sẽ được treo lên trên cùng của bối cảnh thực hiện. Nếu mã hiện đang ở trong bối cảnh của cửa sổ, đó là nơi mà var sẽ kết thúc.

Lớp học là không được lưu trữ trong ECMAScript 6. Vì vậy, lớp học sẽ chỉ khả dụng sau khi được khai báo.

+0

Các lớp học có được hoisted, có nghĩa là * ràng buộc * được tạo ra khi nhập phạm vi, nhưng nó không được khởi tạo. Nó cư xử như 'let'. –

+0

@ FelixKling - Đó là những gì nó nói tại MDN. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes "Một sự khác biệt quan trọng giữa các khai báo hàm và khai báo lớp là các khai báo hàm là các bảng khai báo và không có lớp." Tôi đã diễn giải nó không chính xác? Nó có vẻ khá trực tiếp. –

+0

Mmh, tôi đã đề cập đến những gì được viết trong http://www.ecma-international.org/ecma-262/6.0/#sec-functiondeclarationinstantiation, bước 35. Nhưng tôi đoán "cẩu" có một ý nghĩa khác với tôi nghĩ (có lẽ?). các lớp và khai báo 'let' chắc chắn không được coi là HoistableDeclaration trong spec, vì vậy tôi đoán rằng tôi đã sai. Tuy nhiên, ngay cả những spec không có vẻ để mô tả thuật ngữ "cẩu" một cách rõ ràng. –

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