.Js dosyasında genel değişken nasıl bildirilir


87

Tüm .jsdosyalarda ihtiyaç duyduğum birkaç global değişkene ihtiyacım var .

Örneğin, aşağıdaki 4 dosyayı düşünün:

  1. global.js
  2. js1.js
  3. js2.js
  4. js3.js

Yukarıdaki 4 dosyanın tümünü bir HTML belgesine yüklediğimi düşünürsek global.js, 3 global değişkeni içinde tanımlayıp diğer 3 .jsdosyadan herhangi birinde onlara erişebilmemin bir yolu var mı ?

Birisi bana bunun mümkün olup olmadığını söyleyebilir mi yoksa bunu başarmak için bir çalışma var mı?

Yanıtlar:


97

Değişkenlerinizi global.js'de bir işlev kapsamı dışında tanımlamanız yeterlidir:

// global.js
var global1 = "I'm a global!";
var global2 = "So am I!";

// other js-file
function testGlobal () {
    alert(global1);
}

Bunun çalıştığından emin olmak için, o dosyada tanımlanan herhangi bir değişkene erişmeye çalışmadan önce global.js'yi eklemeniz / bağlamanız gerekir:

<html>
    <head>
        <!-- Include global.js first -->
        <script src="/YOUR_PATH/global.js" type="text/javascript"></script>
        <!-- Now we can reference variables, objects, functions etc. 
             defined in global.js -->
        <script src="/YOUR_PATH/otherJsFile.js" type="text/javascript"></script>
    </head>
    [...]
</html>

Elbette, js dosyalarının yüklenmesinin ilk sayfa yüklemesini kesintiye uğratmasını istemiyorsanız, <body> -tag kapanışından hemen önce komut dosyası etiketlerine bağlanabilirsiniz.


4
Bu cevap doğru olsa da, daha iyi bir anlayış elde etmek ve muhtemelen işleri bu şekilde yapmaktan kaçınmak için Google Javascript değişken kapsamını belirlemenizi tavsiye ederim.
aleemb

1
Kabul. Dağınıklığı ve çatışmaları önlemek için her zaman tüm işlevleri ve değişkenleri ortak bir "ad alanında" kapsamaya çalışırım. Genellikle bunu projenin veya şirketin kısaltması olarak adlandırırım.
PatrikAkerstrand

Bu yanıtı ve diğerlerini olumsuz oylamak, çünkü küresel değişkenin küresel bir kapsamda yaratılacağını varsayar ve ayrıca değişkenden ilk sözün diğer tüm sözlerden önce küresel kapsamda olmasını gerektirir.
Andrew

1
@Andrew Bu cevap sekiz yıl önce yazılmıştır. Tüm niyet ve amaçlar için, o zamanlar doğruydu. Gerçekten bir katkıda bulunmak istiyorsanız, bunun yerine bir düzenleme önermek isteyebilirsiniz?
PatrikAkerstrand

@PatrikAkerstrand Flört aslında hiç fark etmez. Global bir nesne kullanan diğer cevaplar yeterlidir; Bunun neden olmadığını açıkladım.
Andrew

90

Önerilen yaklaşım şudur:

window.greeting = "Hello World!"

Daha sonra herhangi bir işlevden erişebilirsiniz:

function foo() {

   alert(greeting); // Hello World!
   alert(window["greeting"]); // Hello World!
   alert(window.greeting); // Hello World! (recommended)

}

Bu yaklaşım iki nedenden dolayı tercih edilmektedir.

  1. Niyet açıktır. varAnahtar kelimenin kullanımı, varsyerel olması amaçlanan global veya tam tersi olarak kolayca belirtilmesine yol açabilir . Bu tür bir değişken kapsam belirleme, birçok Javascript geliştiricisi için kafa karıştırıcı bir noktadır. Genel bir kural olarak, tüm değişken bildirimlerinin önünde anahtar kelime varveya önek bulunduğundan emin olurum window.

  2. Değişkenleri bu şekilde okumak için bu sözdizimini standartlaştırırsınız, bu da yerel olarak kapsamlı bir şeyin varglobal olanı bozmadığı varveya bunun tersi anlamına gelir . Örneğin, burada ne olduğu belirsizdir:

 

 greeting = "Aloha";

 function foo() {
     greeting = "Hello"; // overrides global!
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // does it alert "Hello" or "Howdy" ?

Ancak, bu çok daha temiz ve daha az hataya meyillidir (tüm değişken kapsam kurallarını gerçekten hatırlamanıza gerek yoktur):

 function foo() {
     window.greeting = "Hello";
 }

 function bar(greeting) {
   alert(greeting);
 }

 foo();
 bar("Howdy"); // alerts "Howdy"

Değişkenleri pencereye eklemek tüm tarayıcılarda çalışmalıdır (ve benim de benim aldığım yaklaşım, +1!).
Dandy

1
@Dan, "var testvar = 'merhaba';" bir fonksiyonun dışında, pencere nesnesine otomatik olarak eklenir ve ona "window.testvar" ile erişebilirsiniz.
zkent

1
@zkent, doğru, ama Window nesnesini kullanmak daha iyi çünkü kodunuzu daha sonra kahve gibi sth'ye dönüştürmek isteyebilirsiniz.
Nami WANG

Belge öneki yerine Pencere kullanmak daha mı iyidir?
Andrew

7

Bunu denediniz mi?

Yaparsan:

var HI = 'Hello World';

İçinde global.js. Ve sonra yapın:

alert(HI);

İçinde js1.jsonu iyi uyaracak. Sadece global.jsgeri kalanını HTML belgesine eklemeniz gerekir .

Tek sorun, onu pencere kapsamında bildirmeniz gerektiğidir (herhangi bir işlevin içinde değil).

Parçayı değiştirip varbu şekilde yaratabilirsiniz, ancak bu iyi bir uygulama değildir.


7

Yukarıda belirtildiği gibi, komut dosyanızda en üst kapsamın kullanılmasıyla ilgili sorunlar vardır. İşte başka bir sorun: Komut dosyası, bazı çalışma zamanı ortamında genel bağlamda olmayan bir bağlamdan çalıştırılabilir.

Küreselin windowdoğrudan atanması önerilmiştir . Ancak bu aynı zamanda çalışma zamanına bağlıdır ve Düğümde vb. Çalışmaz. Taşınabilir genel değişken yönetiminin biraz dikkatli değerlendirme ve ekstra çaba gerektirdiğini gösterir. Belki gelecekteki ECMS sürümlerinde düzelteceklerdir!

Şimdilik, tüm çalışma zamanı ortamları için uygun küresel yönetimi desteklemek için buna benzer bir şey öneriyorum:

/**
 * Exports the given object into the global context.
 */
var exportGlobal = function(name, object) {
    if (typeof(global) !== "undefined")  {
        // Node.js
        global[name] = object;
    }
    else if (typeof(window) !== "undefined") {
        // JS with GUI (usually browser)
        window[name] = object;
    }
    else {
        throw new Error("Unkown run-time environment. Currently only browsers and Node.js are supported.");
    }
};


// export exportGlobal itself
exportGlobal("exportGlobal", exportGlobal);

// create a new global namespace
exportGlobal("someothernamespace", {});

Biraz daha yazı yazıyor, ancak global değişken yönetiminizi geleceğe hazır hale getiriyor.

Sorumluluk reddi: Bu fikrin bir kısmı, stacktrace.js'nin önceki sürümlerine bakarken aklıma geldi .

Tahminimce, çalışma zamanı ortamının daha güvenilir ve daha az hacklenmiş tespiti için Webpack veya diğer araçlar da kullanılabilir.


2
GLOBALartık kullanımdan kaldırılmıştır ve globalbunun yerine kullanılmalıdır.
Thomas

2

Evet bunlara erişebilirsiniz. Bunları 'kamusal alanda' (herhangi bir işlevin dışında) şu şekilde ilan etmelisiniz:

var globalvar1 = 'value';

Bunlara daha sonra başka dosyalarda da erişebilirsiniz.

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.