Soru Yerel değişken neden global değişkenimi öldürüyor?


Bu soru için üzgünüm, ama bu konu gerçekten günümü mahvetti.

Aşağıdaki Kod uyarıları 10 olması gerektiği gibi:

var globalId='10';  
function check(){  
    alert(globalId);  
}  
check();

Ama bu sonraki kod uyarıları Tanımsız:

var globalId='10';  
function check(){  
    alert(globalId); 
    var globalId; 
}  
check();

Bir değişkeni bir işlevde yerel bir değişken olarak bildirirsem, ancak bunu zaten global olarak ilan ettiysem, uyarılarımın nasıl olduğunu söyleyebilirim. Tanımsız?

Bu kolay bir örnektir, fakat orijinal kodumda, fonksiyonun başlangıcı arasında çok fazla şey yaptım, o zaman uzun bir süre sonra globalId tanımlandı, tanımla: if(!globalId){var globalId;} Bu, fonksiyonumun üst kısmında yer alan uyarımın tanımlanmamış olarak, JavaScript ilk önce tüm işlevi yürüttüğü gibi, sadece herhangi bir değişkenin 'bildirilip bildirilmeyeceğini' görmek anlamına gelir ve eğer öyleyse bunları bildirir ve bu nedenle uyarım bir beyan edilmemiş 'değişken.

Bunun neden olduğunu bana anlatabilir miyim, ve eğer JavaScript bir işlevi yürütmeden önce tüm değişkenleri "önceden beyan eder", koşulların bile karşılanmayan değişkenler bile karşılanmıyorsa?


25
2018-03-31 11:31


Menşei


+1 çok güzel soru - Mr_Green
Yerel değişkenler her zaman küresel olanlardan daha fazla olacaktır. C ve diğer birçok dilde aynı. C ++ 'da global değişkeni seçebilirsiniz. ::. Her neyse, küresel ve yerel değişkenleri benzer şekilde adlandırmak kötü bir uygulamadır - phuclv


Cevaplar:


Javascriptte, şöyle denen bir şey olduğunu bilmelisin KALDIRMA.

Bunun esas olarak anlamı, herhangi bir yerel değişken bildirdiğinizde, değişken bildirimi otomatik olarak kapsamın üstüne taşınır.

Örneğin:-

var globalId='10';
function check(){
alert(globalId); var globalId; }
check(); 

Değişiklikler -

var globalId='10';
function check(){
var globalId;
alert(globalId);}
check(); 

GlobalID hala herhangi bir değer atanmamış olduğundan, çıkışınızda undefined döndürür. Yerel değişkenler, her zaman aynı ada sahip küresel değişkenlere göre öncelik kazanır.


23
2018-03-31 11:36



Birincisi, buradaki herkese teşekkür ederim, o kadar hızlı ki bana Scoping hakkındaki cevabı verdim, tüm değişkenlerin yürütmeden önce üst sıralara taşındığını bilmiyordum. Fakat bunun içinde bir kusur var, ve eğer bu fonksiyonun değişken globalId = "ABC123" olduğunu beyan edersem, yine de tanımsız olarak uyarır. bildirimi, daha sonra tanımlanamadım, uyarımın tanımlanmaması yerine "ABC123" yazılmamış mıydı? Görebildiğim gibi, Javascript, globalid'in bildirileceği fikrini harekete geçirir ve bu nedenle, daha sonra kodda yer alacağı gibi, daha önce yapılmadan erişilemez ...? - Per Spjuth
@per Spjuth - yalnızca bildirim, ödeve değil üst sıraya taşınır. Bu nedenle, uyarıdan önce ödeviniz yoksa yine de tanımlanamayacaksınız. - Sachin Shanbhag


Evet, bir işlevde herhangi bir yerde bildirilen tüm değişkenler bu işlevin yereldir ve işlev kodu boyunca bulunur; Aynı isimde bulunan globals tercihinde kullanılacaktır.

itibaren https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals#Variable_Scope :

JavaScript'in blok bildirimi kapsamı yok; bunun yerine, bloğun içinde bulunduğu koda yerel olacaktır. [...] JavaScript'teki değişkenler hakkında başka bir olağandışı şey, istisna olmaksızın daha sonra bildirilen bir değişkene başvurabilmenizdir. Bu kavram kaldırma olarak bilinir; JavaScript'teki değişkenler bir anlamda "kaldırılmış" veya işlev veya ifadenin üstüne kaldırılmışlardır.


16
2018-03-31 11:36





Kodun ikinci kısmında, yerel değişken global olanı maskeler.

var globalId='10';

function check() {
    // Your are defining a local variable in this function
    // so, the global one is not visible.
    alert(globalId);
    var globalId;
}

check(); 


Yopur gerçeği var ifadesi, işlevin sonundaki tanım hiçbir şeyi değiştirmez: genel değişken maskelenir tüm fonksiyon için.

Yani, işlevin bütün yürütülmesi için globalId değişken, global olanı değil yerel olanı referans alır.

Bununla birlikte, bu fonksiyonun dışında, global değişken hala var olacaktır - çünkü fonksiyonun içinden görülemeyecektir. var Beyan.


12
2018-03-31 11:35





Söylendiği gibi, JavaScript kapsam belirleme kurallarına uygun olarak, yerel değişken tüm işlev için globali maskeler. Ancak, global değişken accessd olabilir, aşağıdakileri deneyin

var globalId='10';

function check() {
    // Your are defining a local variable in this function
    // so, the global one is not visible.
    alert('Local : ' + globalId + ', Global : ' + window.globalId);
    var globalId;
}

check(); 

3
2018-03-31 11:43





NEW değişkenini bildirirsiniz globalId iç fonksiyon kapsamı, bu yüzden undefined ve bu doğru. Ve hayır, global değişkeninizi öldürmez, ekleyerek kontrol edebilirsiniz. alert(globalId); sonra check(); aramak.


0
2018-03-31 11:36





Javascript ilk önce tüm işlevi, sanki herhangi bir değişkenin 'bildirilip' gösterilemeyeceğini görmek için çalıştırıyormuş gibi

Bu cevap, az ya da çok. JavaScript yorumlayıcısı, her bir kapsamdaki değişken bildirimleri arar, ardından "bunları", kapsamın en üstüne taşır.


0
2018-03-31 11:41



Javascript yok gerçekleştirmek tüm işlev, sadece ayrıştırır işlev. Bildirimler, gerçekten işlevi yürütmeden önce yukarı taşınır. - Martijn


var globalId='10';  
    function check(){ 
        let globalId = '5'; 
        alert(globalId); 

    }  
    check();

// use let to set a local variable between any {}

0
2018-02-07 15:12