2010-12-28 19 views
31

Khi tôi sử dụng bản phát hành cà phê mới nhất (1.0), một đầu ra javascript đơn giản trông như thế này (theo mặc định):Tại sao sử dụng hàm wrapper javascript (thêm vào trong coffeescript) ".call (this)"

.call (điều này) làm gì và lý do để thêm nó là gì?

+0

bạn cũng có thể hiển thị mã cho sản lượng này không? –

+1

Đoán của tôi là cách đơn giản nhất để làm cho tất cả các biến có phạm vi hàm cục bộ (không toàn cục) theo mặc định và cho phép truy cập vào phạm vi cha mẹ thông qua 'this' – miensol

+2

Đây là một bài viết tuyệt vời về chủ đề của việc đặt tên cho JS: http: //javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ –

Trả lời

15

Tạo một hàm và sau đó gọi chính nó bằng phạm vi chức năng/đối tượng gốc.

.call và .apply là các phương thức khác nhau để gọi hàm. Về cơ bản, bạn đã tạo ra một hàm không có gì ngoại trừ thiết lập một = 1 trong phạm vi riêng của nó.

Trong javascript, bạn cần nhận ra rằng mọi chức năng là một đối tượng và this là những gì đề cập đến đối tượng/chức năng hiện tại. Sử dụng .call(this) ghi đè this từ bên trong hàm và thay thế bằng từ ngữ cảnh gọi.

33

Đó là một cách để đảm bảo rằng CoffeeScript đã biên dịch có phạm vi riêng cho các tên biến. Điều này có lợi ích về hiệu quả và sự đơn giản (bạn biết rằng JavaScript được tạo ra sẽ không bị dẫm lên các biến được sử dụng bởi mã khác). Bạn có thể tắt tùy chọn này với tùy chọn --bare (hoặc -b) đối với trình biên dịch CoffeeScript.

Lý do cho sự call(this) chỉ là để đảm bảo rằng CoffeeScript có cùng this như phạm vi mà nó được đặt, bởi vì chức năng thường không kế thừa đối tượng this của họ từ bối cảnh xung quanh.

+5

Điều này khác với câu hỏi tự thực hiện như thế nào? Giống như: (hàm() { /* Mã */ })(); – qwertymk

+8

Chức năng tự thực hiện mất khái niệm 'này', khi nó không xảy ra được tải trong ngữ cảnh trình duyệt. Một số nền tảng CommonJS đánh giá các tệp đã tải với một 'this' cụ thể. – jashkenas

+2

Tôi hoàn toàn hiểu lý do phạm vi biến, nhưng tôi tò mò muốn biết làm thế nào có một lợi ích hiệu quả. Bạn đang đề cập đến hiệu quả của trình biên dịch, hoặc của JavaScript được tạo ra? –

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