Maafkan saya jika ini adalah cara yang salah untuk mendekati menambahkan poin. Saya belum sering berada di sini, dan akan menerima arahan dan / atau kritik yang membangun.
Jawaban Benjamin menjawab pertanyaan OP dengan sangat baik, tetapi saya ingin menambahkan satu penyesuaian yang akan memberi kita tur lengkap tentang pengangkatan dan keanehannya.
Jika kita memulai kode asli dengan panggilan ke f, seperti:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
Outputnya kemudian akan menjadi:
Me duplicate.
Me original.
Alasannya karena vardan functionpernyataan dikibarkan dengan cara yang sedikit berbeda.
Untuk varitu deklarasi dipindahkan ke bagian atas ruang lingkup saat ini *, tetapi setiap tugas tidak mengangkat. Sejauh nilai dari variabel yang dideklarasikan berjalan, itu tidak ditentukan sampai baris tugas asli tercapai.
Untuk functionpernyataan , baik deklarasi maupun definisi diangkat. Ekspresi fungsi , seperti yang digunakan dalam var f = function() {...konstruksi, tidak diangkat.
Jadi setelah mengangkat, eksekusi seolah-olah kodenya adalah:
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
* Semua cakupan JavaScript adalah leksikal, atau fungsi, cakupan, tetapi sepertinya itu hanya akan membingungkan jika menggunakan kata f pada saat itu.