Soru JavaScript'teki değişkenlerin kapsamı nedir?


Javascript'teki değişkenlerin kapsamı nedir? Bir işlevin dışına aynı kapsamda mı? Yoksa fark eder mi? Ayrıca, global olarak tanımlanmışlarsa depolanan değişkenler nerede?


1715
2018-02-01 08:27


Menşei


İşte başka bir güzel bağlantı bu sorunu akılda tutmak için: "JavaScript kapsamını ve kapanışlarını açıklamak". - Full-Stack Software Engineer
İşte bunu çok güzel açıklayan bir yazı. Javascript değişken kapsamı hakkında bilmeniz gereken her şey - Saurab Parakh
Daha önce de belirtildiği Kyle Simpson'ın e-kitabı Github'da okunabilir ve size JavaScript Kapsamları ve Kapanışları hakkında bilmeniz gereken her şeyi anlatır. Burada bulabilirsiniz: github.com/getify/You-Dont-Know-JS/blob/master/... Bu bir parçası "JS'yi bilmiyorsun" kitap dizisiJavaScript hakkında daha fazla bilgi edinmek isteyen herkes için harika. - 3rik82


Cevaplar:


Yapabileceğim en iyi şeyin, size bir sürü örnek vermek olduğunu düşünüyorum. Javascript programcıları, kapsamı ne kadar iyi anladıklarına göre sıralanır. Bazen oldukça sezgisel olabilir.

  1. Küresel ölçekte bir değişken

    // global scope
    var a = 1;
    
    function one() {
      alert(a); // alerts '1'
    }
    
  2. Yerel kapsam

    // global scope
    var a = 1;
    
    function two(a) {
      // local scope
      alert(a); // alerts the given argument, not the global value of '1'
    }
    
    // local scope again
    function three() {
      var a = 3;
      alert(a); // alerts '3'
    }
    
  3. Orta düzey: JavaScript'te blok kapsamı diye bir şey yok (ES5; ES6 tanıtıyor let)

    a.

    var a = 1;
    
    function four() {
      if (true) {
        var a = 4;
      }
    
      alert(a); // alerts '4', not the global value of '1'
    }
    

    b.

    var a = 1;
    
    function one() {
      if (true) {
        let a = 4;
      }
    
      alert(a); // alerts '1' because the 'let' keyword uses block scoping
    }
    
  4. Orta düzey: Nesne özellikleri

    var a = 1;
    
    function Five() {
      this.a = 5;
    }
    
    alert(new Five().a); // alerts '5'
    
  5. ileri: kapatma

    var a = 1;
    
    var six = (function() {
      var a = 6;
    
      return function() {
        // JavaScript "closure" means I have access to 'a' in here,
        // because it is defined in the function in which I was defined.
        alert(a); // alerts '6'
      };
    })();
    
  6. ileri: Prototip tabanlı kapsam çözünürlüğü

    var a = 1;
    
    function seven() {
      this.a = 7;
    }
    
    // [object].prototype.property loses to
    // [object].property in the lookup chain. For example...
    
    // Won't get reached, because 'a' is set in the constructor above.
    seven.prototype.a = -1;
    
    // Will get reached, even though 'b' is NOT set in the constructor.
    seven.prototype.b = 8;
    
    alert(new seven().a); // alerts '7'
    alert(new seven().b); // alerts '8'
    

  7. Küresel + Yerel: Ekstra karmaşık bir Case

    var x = 5;
    
    (function () {
        console.log(x);
        var x = 10;
        console.log(x); 
    })();
    

    Bu yazdırılacak undefined ve 10 ziyade 5 ve 10 JavaScript her zaman değişken bildirimleri (başlatmaları değil) kapsamın en üstüne taşıdığı için, kodu aşağıdakilere eşdeğer hale getirir:

    var x = 5;
    
    (function () {
        var x;
        console.log(x);
        x = 10;
        console.log(x); 
    })();
    
  8. Catch-scoped değişkenini yakala

    var e = 5;
    console.log(e);
    try {
        throw 6;
    } catch (e) {
        console.log(e);
    }
    console.log(e);
    

    Bu yazdırılacak 5, 6, 5. Avlanma maddesinin içinde e küresel ve yerel değişkenleri gölgeler. Ancak bu özel kapsam sadece yakalanan değişken içindir. Yazarsan var f; catch maddesinin içinde, daha sonra try-catch bloğundan önce veya sonra tanımlamış gibiymişsiniz.


2267
2018-02-01 08:58



Kapsamlı olmaya bile yakın değil, ancak bu belki de Javascript kapsamı hileleri bir bilmeniz gereken hatta modern javascript OKUYUN. - Triptych
Yüksek puanlı bir cevap, neden olduğundan emin değilsiniz. Bu, uygun açıklamalara sahip olmayan bir grup örnek, daha sonra, prototip mirasını (yani özellik çözünürlüğü), kapsam zinciriyle (yani değişken çözünürlük) karıştırıyor gibi görünüyor. Kapsam ve özellik çözümünün kapsamlı (ve doğru) açıklaması comp.lang.javascript'te yer almaktadır. SSS notları. - RobG
@RobG Oldukça derecelendirilmiştir çünkü çok sayıda programcıya, küçük katachresis'e rağmen kullanışlı ve anlaşılırdır. Gönderdiğiniz bağlantı, bazı profesyonellere faydalı olsa da, bugün Javascript yazan çoğu insan için anlaşılmazdır. Cevabı düzenleyerek herhangi bir nomenklatür meselesini düzeltmek için çekinmeyin. - Triptych
@ triptych - Yalnızca küçük şeyleri düzeltmek için cevaplarımı düzenlerim, büyük değil. "Kapsam" ı "özellik" olarak değiştirmek, hatayı düzeltir, ancak miras ve kapsamı çok net bir ayrım olmadan karıştırma konusunu çözmez. - RobG
Dış kapsamdaki bir değişkeni tanımlarsanız ve bir if ifadesi, aynı adla işlevin içindeki bir değişkeni tanımlarsa, şube olmasa bile yeniden tanımlandı. Bir örnek - jsfiddle.net/3CxVm - Chris S


Javascript, belirli bir işlevin kapsamını belirlemek için kapsam zincirlerini kullanır. Genellikle bir küresel kapsam vardır ve tanımlanan her işlevin kendi iç içe alanı vardır. Başka bir işlev içinde tanımlanan herhangi bir işlev, dış işleve bağlı bir yerel kapsamı vardır. Her zaman kaynağın kapsamını tanımlayan konumdur.

Kapsam zincirindeki bir eleman temel olarak ana kapsamına işaret eden bir Harita'dır.

Bir değişkeni çözerken javascript en içteki kapsamda başlar ve dışarı doğru arama yapar.


219
2018-02-01 08:35



Kapsam zincirleri [bellek] için başka bir terimdir Kapaklar... burada okumak / javascript almak için okuyanlar için. - New Alexandria


Global olarak beyan edilen değişkenlerin global bir kapsamı vardır. Bir işlev içinde bildirilen değişkenler, bu işleve kadar kapsamlıdır ve aynı adın küresel değişkenleri gölgelendirilir.

(Eminim gerçek JavaScript programcılarının diğer cevaplarda dikkat çekebilecekleri birçok incelik vardır. bu sayfa tam olarak ne hakkında this herhangi bir zamanda anlamına gelir. İnşallah Bu daha fazla giriş bağlantısı Yine de başlaman için yeterli.)


93
2018-02-01 08:31



Bu soruyu cevaplamaya bile başlayacağımdan korkuyorum. Gerçek bir Javascript Programcısı olarak, cevabın ne kadar çabuk elden çıkabileceğini biliyorum. Güzel yazılar. - Triptych
@Triptych: Elden gelen şeyler hakkında ne demek istediğini biliyorum, ama Lütfen yine de bir cevap ekleyin. Yukarıdakileri sadece birkaç arama yapmaktan aldım ... gerçek deneyime sahip biri tarafından yazılmış bir cevap ciltli Daha iyi olmak için. Lütfen kesinlikle yanlış olan cevabımdan herhangi birini düzeltin! - Jon Skeet
Bir şekilde Jon Skeet, Yığın Taşımı hakkındaki en popüler cevabımdan sorumlu. - Triptych


Eski okul JavaScript

Geleneksel olarak, JavaScript'in gerçekten iki türü vardır:

  1. Küresel kapsam : Uygulamanın başlangıcından itibaren uygulama boyunca değişkenler bilinmektedir. (*)
  2. Fonksiyonel Kapsam : Değişkenler içinde bilinir işlev onlar fonksiyonun başlangıcından itibaren ilan edilirler (*)

Bu konuda ayrıntıya girmeyeceğim çünkü farkı açıklayan daha birçok cevap var.


Modern JavaScript

En yeni JavaScript teknik özellikleri şimdi de üçüncü bir kapsamı izin verir:

  1. Blok Kapsamı : Değişkenler içinde bilinir blokilan edildikleri andan itibaren ilan edildi (**)

Blok kapsamı değişkenlerini nasıl oluşturabilirim?

Geleneksel olarak, değişkenlerinizi şu şekilde yaratırsınız:

var myVariable = "Some text";

Blok kapsamı değişkenleri şu şekilde oluşturulur:

let myVariable = "Some text";

Peki, fonksiyonel kapsam ve blok kapsamı arasındaki fark nedir?

Fonksiyonel kapsam ve blok kapsamı arasındaki farkı anlamak için aşağıdaki kodu dikkate alın:

// i IS NOT known here
// j IS NOT known here
// k IS known here, but undefined
// l IS NOT known here

function loop(arr) {
    // i IS known here, but undefined
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here

    for( var i = 0; i < arr.length; i++ ) {
        // i IS known here, and has a value
        // j IS NOT known here
        // k IS known here, but has a value only the second time loop is called
        // l IS NOT known here
    };

    // i IS known here, and has a value
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here

    for( let j = 0; j < arr.length; j++ ) {
        // i IS known here, and has a value
        // j IS known here, and has a value
        // k IS known here, but has a value only the second time loop is called
        // l IS NOT known here
    };

    // i IS known here, and has a value
    // j IS NOT known here
    // k IS known here, but has a value only the second time loop is called
    // l IS NOT known here
}

loop([1,2,3,4]);

for( var k = 0; k < arr.length; k++ ) {
    // i IS NOT known here
    // j IS NOT known here
    // k IS known here, and has a value
    // l IS NOT known here
};

for( let l = 0; l < arr.length; l++ ) {
    // i IS NOT known here
    // j IS NOT known here
    // k IS known here, and has a value
    // l IS known here, and has a value
};

loop([1,2,3,4]);

// i IS NOT known here
// j IS NOT known here
// k IS known here, and has a value
// l IS NOT known here

Burada değişkeni görebiliriz j sadece ilk döngüde bilinir, ancak önce ve sonra değil. Yine de değişkenimiz i tüm işlevde bilinir.

Ayrıca, blok kapsamındaki değişkenlerin, kaldırılmadıkları için bildirilmeden önce bilinmediklerini de göz önünde bulundurun. Aynı bloğun kapsamındaki aynı bloğu kapsam dışı değişkenini de tekrar reddetme izniniz yok. Bu, blok kapsamındaki değişkenleri, küresel olarak veya işlevsel olarak kapsamlandırılmış değişkenlere göre daha az hataya eğilimli hale getirir; bunlar, kaldırılır ve çoklu beyanlarda herhangi bir hata üretmez.


Bugün blok kapsamı değişkenlerini kullanmak güvenli midir?

Bugün kullanmak güvenli olup olmadığını, ortamınıza bağlıdır:

  • Sunucu tarafı JavaScript kodu yazıyorsanız (node.js), güvenle kullanabilirsiniz let Beyan.

  • İstemci tarafında JavaScript kodu yazıyorsanız ve bir transpiler kullanıyorsanız traceur), güvenle kullanabilirsiniz let ifadesi, ancak kodunuzun performans açısından en iyi, ancak en iyi şey olması muhtemeldir.

  • İstemci tarafında JavaScript kodu yazıyorsanız ve bir transpiler kullanmıyorsanız, tarayıcı desteğini dikkate almanız gerekir.

    Bugün 23 Şubat 2016, bunlar desteklemeyen bazı tarayıcılardır let ya da sadece kısmi desteğiniz var:

    • İnternet gezgini 10 ve aşağıda (destek yok)
    • Firefox 43 ve aşağıda (destek yok)
    • Safari 9 ve aşağıda (destek yok)
    • Opera Mini 8 ve aşağıda (destek yok)
    • Android tarayıcı 4 ve aşağıda (destek yok)
    • Opera 36 ve aşağıda (kısmi destek)
    • Seçme 51 ve aşağıda (kısmi destek)

enter image description here


Tarayıcı desteği nasıl takip edilir?

Hangi tarayıcıların desteklediği ile ilgili güncel bir genel bakış için let Bu cevabı okuma zamanındaki beyanı, bkz. bu Can I Use sayfa.


(*) Küresel ve işlevsel olarak kapsamlandırılmış değişkenler, JavaScript değişkenleri olduğu için bildirilmeden önce başlatılabilir ve kullanılabilir. hoisted. Bu, beyanların her zaman kapsamın en üstünde olduğu anlamına gelir.

(**) Engelli değişkenler kaldırılmaz


55
2018-02-23 18:51



"Bilinmemektedir" yanıltıcıdır, çünkü değişken kaldırma nedeniyle orada bildirilir. - Oriol
Yukarıdaki örnek yanıltıcıdır, 'i' ve 'j' değişkenleri blok dışında bilinmemektedir. 'Let' değişkenlerinin yalnızca bloğun dışında olmayan belirli bir blokta kapsamı vardır. Başka avantajları da olsun, değişkeni tekrar tekrar ifade edemezsiniz ve sözcük kapsamını korur. - zakir
@Oriol: Son olarak cevabımı ve adres kaldırma özelliğini geliştirdim. Cevabım gerekli iyileştirme için teşekkürler. Ben de birkaç başka iyileştirme yaptım. - John Slegers
@JonSchneider: Doğru! "Eski okul javascript" dediğim yerde, ECMAScript 5'ten bahsediyorum ve "modern javascript" e atıfta bulunduğum yerde, ECMAScript 6'yı (ECMAScript 2015) ele alıyorum. Pek çok insanın bilmek istediği gibi (1) blok kapsamı ve işlevsel kapsam arasındaki farkın ne olduğunu, (2) hangi tarayıcıların blok kapsamını desteklediğini ve (3), burada ayrıntıya girmenin gerçekten önemli olduğunu düşünmemiştim. Bugün çalıştıkları proje için blok kapsamını bugün kullanmanın güvenli olup olmadığı. Bu yüzden cevabımı bu konulara yönelttim. - John Slegers
@JonSchneider: (devam) Yine de, son birkaç yıldır JavaScript'e hangi özelliklerin eklendiğini öğrenmek isteyenler için ES6 / ES2015 ile ilgili Smashing Magazine dergisine bir link ekledim. "Modern JavaScript" ile ne demek istediğimi merak ediyor olabilir. - John Slegers


İşte bir örnek:

<script>

var globalVariable = 7; //==window.globalVariable

function aGlobal( param ) { //==window.aGlobal(); 
                            //param is only accessible in this function
  var scopedToFunction = {
    //can't be accessed outside of this function

    nested : 3 //accessible by: scopedToFunction.nested
  };

  anotherGlobal = {
    //global because there's no `var`
  }; 

}

</script>

Kapatmaları araştırmak ve bunları nasıl kullanacağınızı özel üyeler.


35
2018-02-01 08:48





Anahtar, anladığım kadarıyla, Javascript'in daha yaygın olan C bloğu kapsamına göre fonksiyon seviyesi kapsamına sahip olması.

İşte konuyla ilgili iyi bir yazı.


28
2018-05-15 17:38





"Javascript 1.7" de (Mozilla'nın Javascript'e uzantısı) bir tanesi de blok-kapsam değişkenlerini let Beyan:

 var a = 4;
 let (a = 3) {
   alert(a); // 3
 }
 alert(a);   // 4

23
2018-04-06 11:19



Evet, ama kullanmak güvenli mi? Kodum WebKit'te çalışırsa, bu uygulamayı gerçekçi olarak seçer miydim? - Igor Ganapolsky
@Python: Hayır, WebKit desteklemiyor let. - kennytm
Tüm müşterilerden birinin bir şirket iç sistemi gibi bir Mozilla tarayıcısı kullanacağını biliyor olsaydınız bunun için geçerli olan tek geçerli kullanım olurdu. - GazB
Ya da XUL çerçevesini kullanarak programlama yapıyorsanız, Mozilla'nın css, xml ve javascript kullanarak oluşturduğunuz arayüz çerçevesi. - Gerard ONeill
@GazB bile bu korkunç bir fikir! Bugün, müşterilerinizin Mozilla'yı kullandığını biliyorsunuz, sonra artık başka bir şey kullandıklarını belirten yeni bir not geliyor. I.E. Ödeme sistemimizin berbat olmasının sebebi ... IE8 kullanmanız ve IE9 veya IE10 ya da Firefox ya da Chrome kullanmamanız çünkü işe yaramazsa ... - buzzsawddog


Başlangıçta tasarlandığı zaman JavaScript’te kapsam belirleme fikri Brendan Eich geldi HyperCard komut dili HyperTalk.

Bu dilde, ekranlar bir dizi indeks kartına benzer şekilde yapılmıştır. Arka plan olarak adlandırılan bir ana kart vardı. Şeffaftı ve alt kart olarak görülebilir. Bu ana karttaki herhangi bir içerik, üstüne yerleştirilmiş kartlarla paylaşıldı. Üstte yer alan her bir kart, önceki karta göre öncelikli olan kendi içeriğine sahipti, ancak yine de istenirse önceki kartlara erişebiliyordu.

Bu tam olarak JavaScript kapsam belirleme sistemi tasarlanmıştır. Sadece farklı isimler var. JavaScript'teki kartlar bilinir Yürütme bağlamlarıECMA. Bu bağlamların her biri üç ana bölümden oluşmaktadır. Değişken bir ortam, sözcüksel bir ortam ve bu bağlanma. Kart referansına geri dönersek, sözcüksel ortam, yığıntaki önceki kartların tüm içeriğini içerir. Mevcut içerik yığının en üstündedir ve orada bildirilen tüm içerik değişken ortamda saklanır. Değişken çarpışma durumunda değişken ortam öncelikli olacaktır.

Bu bağlanma, içerdiği nesneyi işaret edecektir. Bazı durumlarda, kapsam veya nesnenin içeriği, içerilen nesnenin değişebileceği gibi, bildirilen bir nesnede olduğu gibi, değişen nesne değişmeden değişir. window veya bir yapıcı işlevi.

Bu yürütme kontekstleri, herhangi bir zaman kontrolü aktarılır. Kod çalıştırmaya başladığında kontrol aktarılır ve bu öncelikle fonksiyon yürütme işleminden yapılır.

Yani teknik açıklama budur. Pratikte, bunu JavaScript’te hatırlamak önemlidir

  • Kapsamlar teknik olarak "Yürütme İçeriği"
  • Bağlamlar, değişkenlerin saklandığı ortamlar yığını oluşturur
  • Yığının üst kısmı öncelik kazanır (altta global içeriktir)
  • Her işlev bir yürütme bağlamı oluşturur (ancak her zaman yeni bir bağlantı oluşturmaz)

Bu sayfadaki önceki örneklerden birine (5. "Kapanış") uygulanarak, uygulama bağlamları yığınını takip etmek mümkündür. Bu örnekte yığınta üç bağlam vardır. Bunlar, dış bağlam, var altı tarafından çağrılan hemen çağrılan işlevdeki bağlam ve var altı'ın hemen çağrılan işlevinin içindeki döndürülen işlevdeki bağlam tarafından tanımlanır.

ben) Dış bağlam. A = 1 değişken bir ortama sahiptir.
ii) IIFE bağlamında, bir = 1 sözcüksel ortamına sahiptir, ancak yığında öncelikli olan a = 6 değişken bir ortam vardır.
iii) Dönen işlev bağlamında, bir = 6 sözcüksel ortamına sahiptir ve bu çağrıldığında uyarıda başvurulan değerdir.

enter image description here


18
2017-09-14 20:29





1) Küresel bir kapsam, bir işlev kapsamı ve yakalama kapsamları vardır. Değişkenler için genel olarak 'blok' seviye kapsamı yoktur - ve catch ifadeleri bloklarına isimler ekler.

2) Kapsamlar, işlevler tarafından küresel kapsamın sonuna kadar yerleştirilir.

3) Özellikler prototip zincirinden geçerek çözülür. Deyimiyle nesne özellik adlarını, bloğun tanımladığı sözcük kapsamına getirir.

DÜZENLEME: ECMAAScript 6 (Harmony) desteklemeyi destekliyor ve kromun 'uyum' bayrağına izin verdiğini biliyorum, bu yüzden belki de destekliyor ..

Blok düzeyinde kapsam belirleme için bir destek olalım, ancak gerçekleşmesi için anahtar kelimeyi kullanmanız gerekiyor.

DÜZENLEME: Benjamin'in yorumlarla ilgili açıklamaları ve yakalama ifadelerini işaret ederek, gönderiyi düzenledim ve daha fazlasını ekledim. Hem ile hem de catch ifadeleri, değişkenleri kendi bloklarına ekler ve olduğu bir blok kapsamı. Bu değişkenler, kendilerine iletilen nesnelerin özelliklerine taklit edilir.

 //chrome (v8)

 var a = { 'test1':'test1val' }
 test1   // error not defined
 with (a) { var test1 = 'replaced' }
 test1   // undefined
 a       // a.test1 = 'replaced'

EDIT: Açıklayıcı örnek:

Test1, bloğa kadar genişletilir, ancak a.test1'e takılır. 'Var test1', bir üst niteliği olmadıkça, üst sözcük bağlamında (işlev veya genel) yeni bir değişken testi1 oluşturur.

Olmadı! 'With' kullanırken dikkatli olun - eğer değişken zaten fonksiyonda tanımlanmışsa, bir noop gibi, nesneden ithal edilen isimlere göre de bir noopdur! Halihazırda tanımlanmış olan isimle ilgili küçük bir kafa, bunu daha da güvenli hale getirecektir. Şahsen bundan dolayı asla kullanmayacağım.


16
2017-10-25 00:41



Burada birtakım hatalarınız var, çünkü bir javascriptte blok kapsamı var. - Benjamin Gruenbaum
Kulaklarım (gözler) açık, Benjamin - Yukarıdaki ifadelerim, Javascript kapsamını nasıl ele aldığımı açıklıyor, ancak spekülasyonları okumaya dayanmıyorlar. Ve umarım, bu ifadeyle (nesne kapsamının bir şeklidir) ya da Mozilla'nın özel 'let' sözdizimini kastetmiyorsunuzdur. - Gerard ONeill
İyi, with Beyan olduğu bir blok kapsamı ama catch cümleleri çok daha yaygın bir biçimdir (Fun fact, v8 implements catch Birlikte with) - bu, JavaScript'in kendisinde bulunan tek blokluk bloklama biçimleridir (yani, işlev, global, deneyin / yakalama, ve türevleri), ancak ana bilgisayar ortamları, örneğin tarayıcıdaki satır içi olaylar ve NodeJS'ler gibi farklı kapsam belirleme kavramlarına sahiptir. vm modülü. - Benjamin Gruenbaum
Benjamin - Gördüğüm şeyden, hem ile hem de yakala, nesneyi yalnızca mevcut kapsamı (ve dolayısıyla özellikleri) içine sokar, ancak sonra ilgili blok bittikten sonra, değişkenler sıfırlanır. Fakat örneğin, bir yakalamada tanıtılan yeni bir değişken, kapatma işlevi / yönteminin kapsamına sahip olacaktır. - Gerard ONeill
Tam olarak hangi kapsamı scoping anlamına gelir :) - Benjamin Gruenbaum


JavaScript’e yeni gelen birçok kişinin kalıtımın varsayılan olarak dilde mevcut olduğunu ve bu kapsamın tek kapsam olduğunu anladım. JSPretty adlı geçen yılın sonunda yazdığım bir güzelleştiriciye bir uzantı verdim. Özellik renkleri, koddaki kapsamı işler ve her zaman bu kapsamda bildirilen tüm değişkenlere bir rengi ilişkilendirir. Farklı bir kapsamda bir renkten bir değişkene sahip bir değişken kullanıldığında, kapatma görsel olarak gösterilmektedir.

Şu özelliği deneyin:

Şu adresteki bir demoya bakın:

Kodu şuradan görüntüleyin:

Şu anda bu özellik 16 yuvalanmış fonksiyonun derinliği için destek sunuyor, ancak şu anda global değişkenleri renklendirmiyor.


9
2018-03-21 17:31



Firefox 26 ile benim için çalışmaz. Kodu yapıştırır veya bir dosya yüklerim, çalıştır'a tıklar ve hiçbir şey olmuyor. - Michael Lemke