ยกโทษให้ฉันหากนี่เป็นวิธีที่ผิดในการเพิ่มประเด็น ฉันไม่ได้อยู่แถวนี้มากนักและยินดีต้อนรับการชี้นำและ / หรือคำวิจารณ์ที่สร้างสรรค์
คำตอบของเบนจามินตอบคำถามของ OP ได้อย่างดีเยี่ยม แต่ฉันต้องการเพิ่มการปรับแต่งหนึ่งอย่างที่จะทำให้เราได้รับชมการชักรอกและความแปลกประหลาดของมัน
หากเราเริ่มต้นรหัสเดิมด้วยการเรียกร้องf
ให้ทำดังนี้:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
ผลลัพธ์จะเป็น:
Me duplicate.
Me original.
เหตุผลที่เป็นเช่นนั้นvar
และfunction
ข้อความถูกยกขึ้นในรูปแบบที่แตกต่างกันเล็กน้อย
สำหรับvar
การประกาศถูกย้ายไปที่ด้านบนสุดของขอบเขตปัจจุบัน * แต่การมอบหมายใด ๆจะไม่ถูกยกขึ้น เท่าที่ค่าของ var ที่ประกาศไปจะไม่มีการกำหนดจนกว่าจะถึงบรรทัดการกำหนดเดิม
สำหรับfunction
ข้อความทั้งคำประกาศและคำจำกัดความจะถูกยกขึ้น นิพจน์ฟังก์ชันที่ใช้ในvar f = function() {...
โครงสร้างจะไม่ถูกยกขึ้น
ดังนั้นหลังจากการชักรอกการดำเนินการจะเหมือนกับว่ารหัสคือ:
var f;
function f() {
console.log("Me duplicate.");
}
f();
f = function() {
console.log("Me original.");
}
f();
* ขอบเขต JavaScript ทั้งหมดเป็นศัพท์หรือฟังก์ชันขอบเขต แต่ดูเหมือนว่ามันจะสับสนในการใช้คำ f ณ จุดนั้น