2012-02-22 27 views
23

Nó được coi là thực hành tốt để sử dụng một hàm tự gọi để quấn chế độ nghiêm ngặt mã thích hợp, thường được gọi là chế độ pragma nghiêm ngặt:Làm thế nào để khai báo các biến toàn cầu khi sử dụng chế độ pragma nghiêm ngặt

(function(){ 
    "use strict"; 
    // Strict code here 
}()); 

Câu hỏi của tôi là như thế nào khai báo các biến toàn cầu trong trường hợp này? Ba lựa chọn thay thế mà tôi biết hôm nay:

Alternative 1:

var GLOB = {}; 

(function(){ 
    "use strict"; 
}()); 

Phương án 2:

(function(){ 
    "use strict"; 
    window.GLOB = {}; 
}()); 

Alternative 3:

(function(win){ 
    "use strict"; 
    win.GLOB = {}; 
}(window)); 

Bất kỳ sở thích và động cơ? Sự lựa chọn khác?

+0

http: // stackoverflow.com/questions/9642491/ –

Trả lời

1

Phương pháp 1 sẽ thất bại nếu được dán trong một chức năng khác.

Sử dụng phương pháp 3, sẽ dễ dàng hơn khi xuất các phương thức của bạn sang một không gian tên khác. Chỉ cần thay thế window bằng, ví dụ: frames[0] hoặc document là đủ để đính kèm tất cả các phương thức vào không gian tên tùy chỉnh.

Tôi đề xuất phương pháp 3, vì lý do cuối cùng.

1

Lợi ích của alt 2 và 3 là chúng giữ tất cả mã bên trong "chức năng vùng chứa". Một dòng mã bên ngoài hàm rất dễ bỏ sót khi đọc mã.

Ngoài ra:

  • "GLOB" nên được tên của ứng dụng. - Bạn muốn cho phép nhiều hơn một ứng dụng cho mỗi tệp html/js mà không có xung đột tên.
+0

Tôi chỉ sử dụng GLOB làm trình giữ chỗ cho bất kỳ không gian tên hoặc toàn cục nào tôi muốn tạo. Đồng ý đóng gói bao gồm toàn bộ tập tin cho pragma để có ý nghĩa. – johnwilander

0

Andrea Giammarchi có kỹ thuật tốt để thực hiện việc này, hoạt động trên các trình duyệt. Xác định một hàm trong chức năng tự gọi của bạn được gọi globalEval như vậy:

(function() { 
    "use strict"; 
    function globalEval(data) { 
     data = data.replace(/^\s*|\s*$/g, ""); 
     if (data) { 
      var head = document.getElementsByTagName("head")[0] || document.documentElement, 
       script = document.createElement("script"); 
      script.type = "text/javascript"; 
      script.text = data; 
      head.appendChild(script); 
      head.removeChild(script); 
     } 
    } 

    // use globalEval to stick variables into the global scope 
    globalEval("var myGlobal = 1;"); 
    // myGlobal === 1 
)(); 
// myGlobal === 1 

Hoặc xác định chức năng globalEval bên ngoài của mã tự gọi nếu bạn muốn sử dụng nó trong phạm vi khác.

+0

Tôi nghĩ rằng bạn đã bỏ lỡ điểm của câu hỏi. –

+0

Câu hỏi đặt ra là làm thế nào để khai báo các biến toàn cầu từ bên trong một phạm vi khép kín, phải không? – DaveS

+1

Với các ví dụ, OP muốn biết phương pháp nào trong số những phương pháp này là tốt nhất để xuất các biến đã biết đến phạm vi toàn cầu. Câu trả lời của bạn * không * giải thích cách xác định các biến toàn cục. Tuy nhiên, đó là một cách rất tốn kém để xác định 'GLOB = {};'. –

47

Thay thế IMO 3 là tốt nhất. Nhưng nó giả định rằng window đại diện cho phạm vi toàn cầu - điều này đúng với trình duyệt nhưng không đúng cho các môi trường JS khác (dòng lệnh, Node.js, v.v.).

Sau đây sẽ làm việc trên bảng:

(function(globals){ 
    "use strict"; 
    globals.GLOB = {}; 
}(this)); 
+2

+1 cho tính di động. Tuyệt vời. – andyortlieb

+0

nếu điều này === không xác định điều này sẽ không xác định một câu trả lời toàn cầu, Adassko dưới đây là tốt hơn – kofifus

+0

Sử dụng 'eval' có một số chi phí liên kết với nó. Trong mã của tôi, tôi dự trữ nó cho tình huống mà tôi biết tôi cần nó. Trong trường hợp phổ biến mà bạn cô lập toàn bộ nội dung của tệp tập lệnh trong SEAF, 'this' sẽ trỏ vào phạm vi toàn cục. Xem [các trình bao bọc UMD khác nhau] (https://github.com/umdjs/umd) để sử dụng phổ biến. –

9

Tôi biết đây là một câu hỏi cũ nhưng có một cách không được đề cập nhận được bối cảnh toàn cầu:

(function(globals){ 
    "use strict"; 
    globals.GLOB = {}; 
}((1,eval)('this'))); 

(1,eval)('this')

sẽ đánh giá this từ ngữ cảnh chung, vì vậy bạn có thể dán nó ở bất cứ nơi nào bạn thích và bạn sẽ luôn nhận được ngữ cảnh chung

+0

chỉ có một người làm việc cho tôi, thx! – kofifus

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