มีความแตกต่างคือ
var x = 1
ประกาศตัวแปร x
ในขอบเขตปัจจุบัน (รู้จักในบริบทการดำเนินการ) หากการประกาศปรากฏขึ้นในฟังก์ชั่น - มีการประกาศตัวแปรท้องถิ่น ถ้าอยู่ในขอบเขตทั่วโลกตัวแปรทั่วโลกจะถูกประกาศ
x = 1
ในทางกลับกันเป็นเพียงการมอบหมายคุณสมบัติ ก่อนอื่นพยายามแก้ไขx
กับสายโซ่ขอบเขต หากพบที่ใดก็ได้ในห่วงโซ่ขอบเขตนั้นจะทำการมอบหมาย หากไม่พบx
ก็จะสร้างx
คุณสมบัติบนวัตถุทั่วโลก (ซึ่งเป็นวัตถุระดับบนสุดในห่วงโซ่ขอบเขต)
ตอนนี้สังเกตว่ามันไม่ได้ประกาศตัวแปรทั่วโลกมันสร้างทรัพย์สินส่วนกลาง
ความแตกต่างระหว่างทั้งสองนั้นบอบบางและอาจสร้างความสับสนเว้นแต่ว่าคุณเข้าใจว่าการประกาศตัวแปรยังสร้างคุณสมบัติ (เฉพาะในตัวแปรที่เป็นวัตถุ) และทุกคุณสมบัติใน Javascript (ดี ECMAScript) มีแฟล็กที่แน่นอนที่อธิบายคุณสมบัติของพวกเขา - ReadOnly, DontEnum และ DontDelete
เนื่องจากการประกาศตัวแปรสร้างคุณสมบัติด้วยแฟล็ก DontDelete ความแตกต่างระหว่างvar x = 1
และx = 1
(เมื่อดำเนินการในขอบเขตทั่วโลก) คือการประกาศในอดีต - การประกาศตัวแปร - สร้างคุณสมบัติ DontDelete'able และอันหลังไม่ได้ ด้วยเหตุนี้คุณสมบัติที่สร้างขึ้นผ่านการกำหนดโดยนัยนี้จะสามารถลบออกจากออบเจ็กต์ทั่วโลกและไม่สามารถลบอันแรกที่สร้างผ่านการประกาศตัวแปร -
แต่นี่เป็นเพียงทฤษฎีแน่นอนและในทางปฏิบัติมีความแตกต่างระหว่างทั้งสองมากขึ้นเนื่องจากข้อบกพร่องต่าง ๆ ในการใช้งาน (เช่นจาก IE)
หวังว่ามันจะสมเหตุสมผล:)
[อัพเดท 2010/12/16]
ใน ES5 (ECMAScript 5; ภาษามาตรฐานฉบับที่ 5 เมื่อเร็ว ๆ นี้) มีสิ่งที่เรียกว่า "โหมดเข้มงวด" - โหมดการเลือกใช้ภาษาซึ่งเปลี่ยนพฤติกรรมของการมอบหมายที่ไม่ได้ประกาศเล็กน้อย ในโหมดเข้มงวดมอบหมายให้ตัวระบุไม่ได้ประกาศเป็นReferenceError เหตุผลสำหรับเรื่องนี้คือการจับการมอบหมายโดยไม่ตั้งใจป้องกันการสร้างคุณสมบัติทั่วโลกที่ไม่พึงประสงค์ เบราว์เซอร์ที่ใหม่กว่าบางตัวเริ่มการสนับสนุนในโหมดเข้มงวดแล้ว ดูตัวอย่างตารางที่เข้ากันได้ของฉัน