Bir nokta eklemenin yanlış yolu buysa beni affet. Buralarda pek bulunmadım ve yapıcı yön ve / veya eleştiriyi memnuniyetle karşılarım.
Benjamin'in cevabı, OP'nin sorusuna mükemmel bir şekilde hitap ediyor, ancak bize kaldırma ve tuhaflıkları hakkında tam bir tur verecek bir ince ayar eklemek istiyorum.
Orijinal koda şöyle bir çağrı ile başlarsak f:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Çıktı daha sonra:
Me duplicate.
Me original.
Bunun nedeni varve functionifadeler biraz farklı şekillerde yükseltilmiştir.
İçin beyanı geçerli kapsamı * üstüne taşınır, ancak herhangi bir atama çekilmez. Bildirilen değişkenin değeri gittiği sürece, orijinal atama satırına ulaşılana kadar tanımsızdır.var
İçin functionifadeleri , beyan hem ve tanımı askıya alır. Yapıda kullanılan işlev ifadelerivar f = function() {... kaldırılmaz.
Yani kaldırma işleminden sonra yürütme, kod sanki:
var f;
function f() {
console.log("Me duplicate.");
}
f();
f = function() {
console.log("Me original.");
}
f();
* Tüm JavaScript kapsamı sözcüksel veya işlev, kapsamdır, ancak o noktada f sözcüğünü kullanmak bazı şeyleri karıştıracak gibi görünüyordu.