Làm cách nào để khai báo một biến toàn cục trong JavaScript?


Câu trả lời:


215

Nếu bạn phải tạo các biến toàn cục trong mã sản xuất (cần tránh), hãy luôn khai báo chúng một cách rõ ràng :

window.globalVar = "This is global!";

Mặc dù có thể định nghĩa một biến toàn cục bằng cách bỏ qua var(giả sử không có biến cục bộ cùng tên), nhưng làm như vậy sẽ tạo ra một toàn cầu ngầm , đó là một điều xấu phải làm và sẽ tạo ra lỗi trong chế độ nghiêm ngặt .


windowchỉ có sẵn trong trình duyệt. Bạn có thể chỉnh sửa bạn trả lời để làm cho nó hoạt động trong tất cả các môi trường? Xem Làm thế nào để có được đối tượng toàn cầu trong JavaScript?
Michał Perłakowski

52

Nếu đây là ứng dụng duy nhất mà bạn sẽ sử dụng biến này, thì cách tiếp cận của Felix là tuyệt vời. Tuy nhiên, nếu bạn đang viết một plugin jQuery, hãy xem xét "không gian tên" (chi tiết về các trích dẫn sau ...) các biến và hàm cần thiết trong đối tượng jQuery. Ví dụ: tôi hiện đang làm việc trên một menu bật lên jQuery mà tôi đã gọi là miniMothy. Vì vậy, tôi đã định nghĩa một "không gian tên" miniMenutrong jQuery và tôi đặt mọi thứ ở đó.

Lý do tôi sử dụng dấu ngoặc kép khi tôi nói về không gian tên javascript là vì chúng không thực sự là không gian tên theo nghĩa thông thường. Thay vào đó, tôi chỉ sử dụng một đối tượng javascript và đặt tất cả các hàm và biến của mình làm thuộc tính của đối tượng này.

Ngoài ra, để thuận tiện, tôi thường tạo không gian tên cho plugin bằng một i không gian tên cho những thứ chỉ nên được sử dụng nội bộ trong plugin, để ẩn nó khỏi người dùng plugin.

Đây là cách nó hoạt động:

// An object to define utility functions and global variables on:
$.miniMenu = new Object(); 
// An object to define internal stuff for the plugin:
$.miniMenu.i = new Object();

Bây giờ tôi chỉ có thể làm $.miniMenu.i.globalVar = 3hoặc $.miniMenu.i.parseSomeStuff = function(...) {...}bất cứ khi nào tôi cần lưu một cái gì đó trên toàn cầu, và tôi vẫn giữ nó ra khỏi không gian tên toàn cầu.


Cảm ơn vì điều đó, trong trang web mà tôi đã đề cập ở trên, phương pháp của Felix hoạt động tốt, nhưng tôi có một trang web khác tôi cũng đang làm việc sử dụng một số plugin và cách tiếp cận của bạn sẽ rất lý tưởng nếu tôi có thể làm cho nó hoạt động. Chúc mừng sự giúp đỡ của bạn.
Vũ công

Điều này hoạt động hoàn toàn tốt! Chỉ cần đảm bảo như @Tomas nói, Tạo lớp / chủ sở hữu của riêng bạn cho các hàm hoặc biến tùy chỉnh của riêng bạn. +1
Pierre

Cảm ơn anh! Nếu không cần thêm, xóa đối tượng cha (ví dụ delete $.miniMenu:). Là nó ổn?
Kunj

1
@KunJ: Chắc chắn, như với bất cứ điều gì: nếu bạn có thể đảm bảo rằng nó sẽ không được sử dụng nữa, thì an toàn để xóa nó. Tuy nhiên, JavaScript sẽ thu thập rác cho bạn, vì vậy bạn không cần phải làm vậy delete $.miniMenu.
Tomas Aschan

20

EDIT Câu hỏi là về JavaScript, câu trả lời là về jQuery, sai. Đây là một câu trả lời cũ, từ thời jQuery được phổ biến rộng rãi.

Thay vào đó, tôi khuyên bạn nên hiểu phạm viđóng cửa trong JavaScript

Câu trả lời cũ, tệ: Với jQuery bạn chỉ có thể làm điều này, bất kể khai báo ở đâu:

$my_global_var = 'my value';

Và sẽ có sẵn ở khắp mọi nơi. Tôi sử dụng nó để thực hiện các phòng trưng bày hình ảnh nhanh chóng, khi hình ảnh được lan truyền ở những nơi khác nhau, như vậy:

$gallery = $('img');
$current = 0;

$gallery.each(function(i,v){
    // preload images
    (new Image()).src = v;
});
$('div').eq(0).append('<a style="display:inline-block" class="prev">prev</a> <div id="gallery"></div> <a style="display:inline-block" class="next">next</a>');
$('.next').click(function(){
    $current = ( $current == $gallery.length - 1 ) ? 0 : $current + 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});
$('.prev').click(function(){
    $current = ( $current == 0 ) ? $gallery.length - 1 : $current - 1;
    $('#gallery').hide().html($gallery[$current]).fadeIn();
});

Mẹo : chạy toàn bộ mã này trong bảng điều khiển trong trang này ;-)


3
Không phải là $ gallery và $ hiện tại chỉ là các biến toàn cục bình thường? Chúng hoạt động vì bạn đang xác định chúng là biến toàn cục bằng cách bỏ qua 'var', nhưng ký hiệu đô la ở phía trước không biến chúng thành 'biến jQuery' ... Nghĩa đen là đặt dấu gạch dưới hoặc bất kỳ dấu hiệu nào khác từ chúng ... Chúng sẽ là các biến jQuery nếu bạn sử dụng đối tượng jQuery ($) và thêm một thuộc tính vào nó: $ .myGlobalVariable = 'giá trị của tôi' ...
Andres Elizondo

Bạn có thể đúng, nhưng điều đáng chú ý là sử dụng cú pháp $ myVar bạn nhận được 2 biến, 1) biến là toàn cục mà không có bất kỳ khai báo đặc biệt nào (ngoài $); và 2) bạn có thể theo dõi các biến toàn cục của mình rất dễ dàng bên trong mã. Mở để thảo luận mặc dù ...
aesede

Một câu trả lời sai lầm. Đồng ý với Andres, đó hoàn toàn không phải là một biến jQuery. Nếu bạn không xác định $current = 0;lúc bắt đầu chức năng, thì cái sau sẽ không hoạt động.
harrrrrrry

15

Dưới đây là một ví dụ cơ bản về một biến toàn cục mà các chức năng còn lại của bạn có thể truy cập. Dưới đây là một ví dụ trực tiếp cho bạn: http://jsfiddle.net/fxCE9/

var myVariable = 'Hello';
alert('value: ' + myVariable);
myFunction1();
alert('value: ' + myVariable);
myFunction2();
alert('value: ' + myVariable);


function myFunction1() {
    myVariable = 'Hello 1';
}

function myFunction2() {
    myVariable = 'Hello 2';
}

Nếu bạn đang làm điều này trong một hàm jquery ready () thì hãy đảm bảo rằng biến của bạn nằm trong hàm ready () cùng với các hàm khác của bạn.


Câu trả lời tốt nhất cho cách các biến toàn cầu hoạt động trong jQuery.
Clinton Green

1
Tôi biết tôi đang đào mộ nhưng đây thậm chí không phải là một biến toàn cầu rõ ràng. Đây là một sự đồng điệu hơn với một biến công khai được chia sẻ không nằm trong một bao đóng cho các tập lệnh cực kỳ nhỏ. Chúng là hai phương thức / cách sử dụng hoàn toàn khác nhau và cách này sẽ khiến bạn gặp rắc rối lớn nếu việc khai báo toàn cầu rõ ràng trong một tập lệnh nằm ở giữa một số tập lệnh khác nhau. Tôi chỉ có thể tưởng tượng một mặt trước trong nhóm của tôi khai báo một biến toàn cục ở đầu tập lệnh là biến thứ 10 được gọi vào DOM.
Brian Ellis

4

Khai báo biến ngoài hàm

function dosomething(){
  var i = 0; // can only be used inside function
}

var i = '';
function dosomething(){
  i = 0; // can be used inside and outside the function
}

3

Cách tốt nhất là sử dụng closures, bởi vì windowđối tượng nhận được rất, rất lộn xộn với các thuộc tính.

Html

<!DOCTYPE html>
<html>
  <head>
    <script type="text/javascript" src="init.js"></script>
    <script type="text/javascript">
      MYLIBRARY.init(["firstValue", 2, "thirdValue"]);
    </script>
    <script src="script.js"></script>
  </head>

  <body>
    <h1>Hello !</h1>
  </body>    
</html>

init.js (Dựa trên câu trả lời này )

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function(i) {
            return _args[i];
        }
    };
}());

script.js

// Here you can use the values defined in the html as if it were a global variable
var a = "Hello World " + MYLIBRARY.helloWorld(2);

alert(a);

Đây là plnkr . Hy vọng nó sẽ giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.