2017-11-08 45 views
5

Tôi đã xem xét điều này trong code generated by Babel từ this source. Nó sẽ xuất hiện để được bảo vệ một chức năng cần thiết, bằng cách nào đó.Mục đích gọi (0, func)() trong JS là gì?

(0, _utilities.validateNextState)(nextDomainState, reducerName, action); 

Tôi hiểu như thế nào tuyên bố dấu phẩy trong ngoặc loại bỏ các 0 và trả về validateNextState chức năng, nhưng tại sao không chỉ làm:

_utilities.validateNextState(nextDomainState, reducerName, action); 

tôi đoán là một loại bảo vệ (như đóng cửa bảo vệ phạm vi , hoặc setTimeout làm cho một cuộc gọi chức năng không đồng bộ), nhưng không thể tìm ra mục đích của nó là gì.

+2

Có thể tránh đặt 'this' thành' _utilities' bên trong cuộc gọi. – user2357112

Trả lời

3

Ngữ nghĩa đôi khi bí ẩn của JavaScript có lẽ là lý do. Biểu thức

(0, _utilities.validateNextState) 

đánh giá tất nhiên để tham chiếu đến hàm đó. Tuy nhiên, vì nó nằm trong biểu thức con được lồng tiếng, hàm gọi bên ngoài sẽ được thực hiện mà không cần rằng đối tượng _utilities được nhận dạng là ngữ cảnh cho cuộc gọi (giá trị this). Do đó, bên trong hàm validateNextState, this sẽ là undefined hoặc tham chiếu đến đối tượng chung, tùy thuộc vào trạng thái chế độ "nghiêm ngặt".

Tôi nghi ngờ rằng Babel thực hiện điều đó vì trong mã nguồn ban đầu, lệnh gọi tới validateNextState() được thực hiện như thể nó là một hàm "trần truồng", không phải là phương thức trên đối tượng. Babel không biết (có lẽ) liệu giá trị của this có quan trọng đối với chức năng cụ thể đó không, nhưng nó phải đảm bảo rằng nó được gọi một cách an toàn.

+0

Nhưng tại sao không chỉ '(_utilities.validateNextState) (args)'? Edit: Rõ ràng điều này sẽ không có hiệu ứng đó nhưng tôi không có ý tưởng tại sao. –

+0

@Derek 朕 會 功夫 JavaScript là lạ. – Pointy

+0

Bạn đã quên ™ @Pointy: p –

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