Câu trả lời:
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 .
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" miniMenu
trong 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 = 3
hoặ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.
delete $.miniMenu
:). Là nó ổn?
delete $.miniMenu
.
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 và đó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 ;-)
$current = 0;
lúc bắt đầu chức năng, thì cái sau sẽ không hoạt động.
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.
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
}
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!
window
chỉ 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?