قوانین محدوده
تفاوت اصلی قوانین محدوده است. متغیرهایی که با کلمهکلیدی var تعریف میشن به بدنهی تابع بلافصل محدود میشن (پس به این دلیل بهش میگن محدودهی تابع)، در حالی که متغیرهای let به بلوک بلافصل محصور شده با { } محدود میشن (پس بهش میگن محدودهی بلوک).
function run() {
var foo = "Foo";
let bar = "Bar";
console.log(foo, bar); // Foo Bar
{
var moo = "Mooo"
let baz = "Bazz";
console.log(moo, baz); // Mooo Bazz
}
console.log(moo); // Mooo
console.log(baz); // ReferenceError
}
run();
دلیل معرفی کلمهکلیدی let به زبان این بود که محدودهی تابع گیجکننده بود و یکی از منابع اصلی باگها در جاوا اسکریپت بود.
Hoisting
متغیرهایی که با کلمهکلیدی var تعریف میشن، به بالا کشیده میشن و مقداردهی اولیه میشن، یعنی حتی قبل از اینکه تعریف بشن، در محدودهی خود قابل دسترسی هستن و مقدارشون undefined هست.
function checkHoisting() {
console.log(foo); // undefined
var foo = "Foo";
console.log(foo); // Foo
}
checkHoisting();
ایجاد ویژگی شیء گلوبال
let ویژگی روی شی گلوبال ایجاد نمیکنه. اما var اینکارو انجام میده
var foo = "Foo";
let bar = "Bar";
console.log(window.foo); // Foo
console.log(window.bar); // undefined
تعریف مجدد
در حالت strict mode شما میتونی دو یا چند متغیر هم نام با var بسازی اما let به شما این اجازه رو نمیده
'use strict';
var foo = "foo1";
var foo = "foo2"; // Moshkeli vojood nadare va foo2 replace mishe ba foo1
let bar = "bar1";
let bar = "bar2"; // SyntaxError