SORU
30 EYLÜL 2011, Cuma


İşlev sipariş JavaScript: niçin bu kadar önemli?

Orijinal Soru:

JSHint benim JavaScript daha da çağrısı daha sayfayı aşağı tanımlanmış bir işlevi çağırdığında yakınıyor. Ancak, benim sayfa bir oyun için ve işlevleri her şey indirdiği kadar denir. Neden sipariş fonksiyonları kod benim sorun görünüyor mu?

EDİT: cevabı buldum sanırım.

http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

İçinde inleyen benim. Kod, BAŞKA bir gün Yeniden Sipariş geçirmek gerekiyor anlaşılan altı bin satır. Javascript ile öğrenme eğrisi dik değildir, ama çok loooooong.

CEVAP
30 EYLÜL 2011, Cuma


Edit: ayrıca bazı ES6 tanımlamalar kapsayan genel bir bakış (, *let*8): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_Cheatsheet

Bu garip davranışına bağlıdır

  1. Fonksiyonları tanımlamak nasıl
  2. Onları çağırdığınızda.

İşte bazı örnekler.

bar(); //This won't throw an error
function bar() {}

foo(); //This will throw an error
var foo = function() {}

----

bar();
function bar() {
    foo(); //This will throw an error
}
var foo = function() {}

----

bar();
function bar() {
    foo(); //This _won't_ throw an error
}
function foo() {}

---

function bar() {
    foo(); //no error
}
var foo = function() {}
bar();

Bu bir şey denirkaldırma!

Fonksiyonları tanımlamanın iki yolu vardır: bir İşlevbeyannamesive işleviifade. function name() {} Bu gibi yazıyorsun . hadi biraz yanlış bir şey söylemek çok fark can sıkıcı ve dakikabeyannamesibunu yazarken , ve var name = function() {} (veya adsız işlevi bir dönüş, böyle şeyler için atanan) gibi bir işlevi varifade.

İlk olarak, değişkenlerin nasıl işleneceğini bak:

var foo = 42;

//the interpreter turns it into this:
var foo;
foo = 42;

Şimdi, nasıl işlevbildirimleriele alınır:

var foo = 42;
function bar() {}

//turns into
var foo; //Insanity! It's now at the top
function bar() {}
foo = 42;

var tablolar "atar"yaratılışçok üst foo ama değeri henüz atama yok. İşlev bildirimi sırada gelir, ve son olarak bir değer foo atanır.

Peki buna ne demeli?

bar();
var foo = 42;
function bar() {}
//=>
var foo;
function bar() {}
bar();
foo = 42;

Tekbeyannamesifoo üstüne taşınır. Atama bar çağrısı kaldırma oluşmadan önce nerede yaptı, sonra gelir.

Ve son olarak, sıkıştırma için:

bar();
function bar() {}
//turns to
function bar() {}
bar();

Şimdi, ne işlevi hakkındaifadeler?

var foo = function() {}
foo();
//=>
var foo;
foo = function() {}
foo();

Sıradan değişkenler gibi, ilk fooilan ettikapsamı en yüksek noktasında, o zaman bir değer atanır.

Hadi ikinci örnek, bir hata atar neden bakın.

bar();
function bar() {
    foo();
}
var foo = function() {}
//=>
var foo;
function bar() {
    foo();
}
bar();
foo = function() {}

Daha önce gördüğümüz gibi, sadece foo oluşturma çekiliyor, atama çıktı nereden geliyor "özgün" (BM çekilir) kodu. bar denir, foo foo === undefined bir değer atanır önce. Şimdi bar işlev gövdesi içinde eğer yapıyorsan gibi bir hata atar undefined(),.


tl;drEğer her şeyi yükler kadar bir şey arıyorsanız, bir şey olmaz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ciaran Blumenfeld

    Ciaran Blume

    20 NİSAN 2009
  • FOSDEM

    FOSDEM

    13 Ocak 2009
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007