2014-09-28 12 views
6

Tôi đã được viết module trong nodejs như sau:Nodejs: Bao bì toàn bộ kịch bản trong một cuộc gọi chức năng

module.exports = function (logger, db, external,constants) { 

     return { 
      //something 

     } 
    } 

Gần đây ai đó trong đội của tôi gợi ý rằng toàn bộ kịch bản nên được bọc trong một chức năng để tránh nhầm lẫn toàn cầu của các biến tức là như thế này:

(function() { 
    'use strict'; 
    module.exports = function (logger, db, external,constants) { 

     return { 
       //something 
     } 
    } 

}()); 

Tôi hiểu rằng thực tế này thường được sử dụng ở mã phía máy khách. Nhưng trong khi phía máy chủ trong nodejs là điều này yêu cầu? Tôi nghĩ rằng trong nodejs có thực sự không có phạm vi toàn cầu và chỉ có module.exports là một trong đó có thể truy cập thực sự không phân biệt bất cứ điều gì chúng tôi viết trong tập lệnh (ofcourse không đi hoang dã ở đây).

+6

Không có lý do gì. Các mô-đun nút được mặc định thực hiện trong một phạm vi riêng. – Bergi

Trả lời

11

Không, IIFE s không bắt buộc với Node.js.

Chúng có thể hữu ích cho bất kỳ tập lệnh nào có thể được sử dụng trong nhiều môi trường (UMD).

Nhưng, mỗi module/file thực thi bởi Node.js được đưa ra một "phạm vi mô-đun," tương tự như phạm vi một IIFE cung cấp, as described under "Globals":

Trong trình duyệt, phạm vi cấp cao nhất là toàn cầu phạm vi. Điều đó có nghĩa là trong các trình duyệt nếu bạn đang ở trong phạm vi toàn cầu, var something sẽ xác định một biến toàn cục. Trong Nút này, điều này khác. Phạm vi cấp cao nhất không phải là phạm vi toàn cầu; var something bên trong mô-đun Nút sẽ là cục bộ cho mô-đun đó.

Mặc dù, vẫn còn phạm vi toàn cầu với Node.js. Khi một mô-đun tạo ra một toàn cầu, nó sẽ có thể truy cập được trong các mô-đun khác được sử dụng bởi cùng một quá trình.

foo = 'bar'; // lack of `var` defines a global 

console.log(global.foo); // 'bar' 
+1

vì vậy tôi chỉ nên tránh tạo các biến không có var nhưng IIFE không phải là bắt buộc. – Sikorski

1

Bạn đang thực sự đã thực hiện việc này.

gì anh ấy gợi ý là để bọc toàn bộ kịch bản trong một chức năng như thế này:

function() { 

} 

Đó là tất cả. Không có gì đặc biệt. Tất nhiên, trong javascript thông thường, định nghĩa hàm chỉ định nghĩa một hàm và mã bên trong hàm không chạy. Vì vậy, để tự động chạy hàm bạn bọc nó trong ngữ cảnh biểu thức và gọi nó:

(function() { 

})() 

Tuy nhiên, trong node.js bạn không cần phải làm điều này. Thay vào đó, bạn có thể chỉ cần gọi hàm khi bạn yêu cầu mô-đun. Vì vậy, trong Node.js, điều này làm điều chính xác cùng về việc tạo ra một phạm vi riêng:

module.exports = function() { 

} 

Vì vậy, nói với bạn bè của bạn bạn đã gói toàn bộ kịch bản trong một hàm.

Đây có lẽ là trường hợp đầu tiên tôi thấy sự tổn hại trong việc đặt tên mọi thứ và các mẫu thiết kế. Trong trường hợp này, bạn của bạn đang nghĩ đến IIFE. Nhưng IIFE không có gì đặc biệt cả. IIFE không tạo ra phạm vi riêng. Đó là chức năng tạo phạm vi. IIFE chỉ là một phương tiện cho chức năng gọi chính nó. Đó là lý do tại sao tôi thích gọi nó là tự gọi-chức năng để tránh cho nó một cảm giác ma thuật mà có thể gây ra một số người cảm nhận nó như một cái gì đó đặc biệt.

+0

Đó là suy nghĩ đầu tiên của tôi khi tôi nhìn thấy ví dụ của anh ấy: anh ấy đã gói mô-đun của anh ấy vào một chức năng. – ken

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