JavaScript'te genel bir değişken nasıl bildirilir?


Yanıtlar:


215

Üretim kodunda (kaçınılması gereken) global değişkenler oluşturmanız gerekiyorsa, bunları her zaman açıkça beyan edin :

window.globalVar = "This is global!";

Global bir değişkeni sadece atlayarak var(aynı adda yerel bir değişken olmadığı varsayılarak) tanımlamak mümkün olsa da , bunu yapmak örtük bir global üretir , bu da yapılması zor bir şeydir ve katı modda bir hata oluşturur .


windowyalnızca tarayıcılarda kullanılabilir. Tüm ortamlarda çalışmasını sağlamak için yanıtınızı düzenleyebilir misiniz? Bkz . Global nesneyi JavaScript'e nasıl alabilirim?
Michał Perłakowski

52

Bu değişkeni kullanacağınız tek uygulama bu ise Felix'in yaklaşımı mükemmeldir. Bununla birlikte, bir jQuery eklentisi yazıyorsanız, jQuery nesnesi altında gereken "namespacing" (tırnak işaretleri hakkında ayrıntılar ...) değişkenlerini ve işlevlerini göz önünde bulundurun. Örneğin, şu anda miniMenu olarak adlandırdığım bir jQuery açılır menüsü üzerinde çalışıyorum. Böylece, miniMenujQuery altında bir "ad alanı" tanımladım ve ben her şeyi oraya yerleştirin.

Javascript ad alanları hakkında konuşurken tırnak kullanmamın nedeni, normalde gerçekten ad alanı olmamasıdır. Bunun yerine, sadece bir javascript nesnesi kullanın ve tüm işlevleri ve değişkenleri bu nesnenin özellikleri olarak yerleştirin.

Ayrıca, kolaylık sağlamak için eklenti ad alanını genellikle eklentinin ikullanıcılarından gizlemek için eklentinin içinde yalnızca dahili olarak kullanılması gereken şeyler için bir ad alanı ile alt boşluklara ayırırım.

Bu nasıl çalışır:

// 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();

Şimdi yapabilirim $.miniMenu.i.globalVar = 3ya da bir $.miniMenu.i.parseSomeStuff = function(...) {...}şeyi küresel olarak kaydetmem gerektiğinde ve hala küresel ad alanından uzak tutuyorum.


Bunun için teşekkürler Tomas, Yukarıda bahsettiğim sitede Felix yaklaşımı iyi çalışıyor, ancak üzerinde çalıştığım birkaç eklenti kullanan başka bir sitem var ve eğer işe yarayabilirseniz yaklaşımınız ideal olacaktır. Yardımın için şerefe.
Dansçı

Bu mükemmel çalışıyor! @Tomas'ın dediği gibi, kendi özel işlevleriniz veya değişkenleriniz için kendi sınıfınızı / sahibinizi yapın. +1
Pierre

Teşekkürler Tomas! Başka gerekli değilse, üst nesneyi silin (örneğin:) delete $.miniMenu. Tamam mı?
Kunj

1
@KunJ: Elbette, her şeyde olduğu gibi: artık kullanılmayacağını garanti ederseniz, onu silmek güvenlidir. Eğer kalmamak Ancak, JavaScript irade çöp, sizin için toplamak zorunda için delete $.miniMenu.
Tomas Aschan

20

EDIT Soru JavaScript ile ilgili, cevap yanlış jQuery hakkında. Bu, jQuery'nin yaygın olduğu zamanlardan beri eski bir cevaptır.

Bunun yerine, JavaScript'teki kapsamları ve kapanışları anlamayı öneririm

Eski, kötü cevap: jQuery ile, bildirim nerede olursa olsun, bunu yapabilirsiniz:

$my_global_var = 'my value';

Ve her yerde mevcut olacak. Görüntüler farklı yerlere yayıldığında hızlı resim galerileri yapmak için kullanıyorum, şöyle:

$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();
});

İpucu : Bu kodun tamamını bu sayfadaki konsolda çalıştırın ;-)


3
$ Galeri ve $ current sadece normal global değişkenler değil mi? Çalışıyorlar çünkü onları 'değişken'i atlayarak küresel değişkenler olarak tanımlıyorsunuz, ancak önlerindeki dolar işareti onları' jQuery değişkenleri 'yapmıyor ... Kelimenin tam anlamıyla bir alt çizgi veya başka bir işaret koymak gibi. ... jQuery nesnesini ($) kullanır ve buna bir özellik eklerseniz jQuery değişkenleri olurlar: $ .myGlobalVariable = 'değerim' ...
Andres Elizondo

Muhtemelen haklısınız, ancak dikkat etmeniz gereken şey, $ myVar sözdizimini kullanarak 2 avantaj elde edersiniz, 1) değişken herhangi bir özel bildirim olmadan ($ dışında) küreseldir; ve 2) global değişkenlerinizi kod içinde kolayca takip edebilirsiniz. Yine de tartışmaya açık ...
aesede

Yanlış bir cevap. Andres ile katılıyorum, bu bir jQuery değişkeni DEĞİLDİR. Eğer $current = 0;fonksiyonun başında tanımlamazsanız , bir sonraki fonksiyon çalışmaz.
harrrrrrry

15

Aşağıda, işlevlerinizin geri kalanının erişebileceği genel bir değişkene temel bir örnek verilmiştir. İşte size canlı bir örnek: 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';
}

Bunu bir jquery ready () işlevi içinde yapıyorsanız, değişkeninizin diğer işlevlerinizle birlikte ready () işlevi içinde olduğundan emin olun.


Küresel değişkenlerin jQuery'de nasıl çalıştığına dair en iyi cevap.
Clinton Green

1
Mezar kazmaya gittiğimi biliyorum ama bu açık bir küresel değişken bile değil. Bu, son derece küçük komut dosyalarının kapanışına girmeyen ortak bir ortak değişkenle daha uyumludur. Bunlar tamamen farklı iki yöntem / kullanımdır ve birkaç farklı komut dosyasının ortasında bulunan bir komut dosyasında açık bir genel beyan ederseniz, bu sizi büyük sıkıntıya sokacaktır. Ekibimde sadece bir betiğin en üstünde DOM'a çağrılan 10. olan global bir değişken bildiren bir ön uç hayal edebiliyorum.
Brian Ellis

4

Değişkeni işlevlerin dışında bildirme

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

En iyi yol kullanmaktır closures, çünkü windownesne çok, çok karmaşıklaşır özelliklere sahiptir.

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 ( Bu yanıta göre )

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);

İşte plnkr . Umarım yardımcı olur!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.