İş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
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
- Fonksiyonları tanımlamak nasıl
- 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 foo
ilan 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.
JavaScript bir işlev için varsayılan p...
Ne kadar çok baskı JavaScript kullanar...
Ne kadar boş bir Javascript nesnesi iç...
saf JavaScript jQuery eşdeğer'in ...
'in JavaScript kapsüllü anonim iş...