با سلام به شماهمراهان گرامی ، امیدوارم که خوب باشید و سلامت.Hoisting در واقع به یک رفتار پیش فرض زبان جاوا اسکریپت اطلاق می گردد. این رفتار عبارتند از انتقال خودکار تعریف متغیر (variable declaration) به بالای حوزه (scope) جاری.
در جاوا اسکریپت این امکان وجود دارد که یک متغیر را پیش از اینکه تعریف شود بکار برد. به عبارتی دیگر می توان متغیر را مورد استفاده قرار داده، بعدا آن را تعریف کرد.
نتیجه ی مثال ۱ و ۲ هر دو یکسان هست.
مثال ۱
نمونه یک
?
۱
۲
۳
۴
۵
۶
x = 5; // Assign 5 to x
elem = document.getElementById(“demo”); // Find an element
elem.innerHTML = x; // Display x in the element
var x; // Declare x
مثال ۲
نمونه دو
?
۱
۲
۳
۴
۵
var x; // Declare x
x = 5; // Assign 5 to x
elem = document.getElementById(“demo”); // Find an element
elem.innerHTML = x; // Display x in the element
برای درک این مثال؛ ابتدا باید با واژه ی “hoisting” آشنا بشیند.
Hoisting رفتار زبان جاوا اسکریپت می باشد که کلیه ی تعریفات (متغیرها) را به بالای scope جاری (به بالای اسکریپت یا تابع جاری) جا به جا می کند.
دقت داشته باشید که جاوا اسکریپت تنها تعریف ها را hoist می کند (به بالای حوزه ی جاری انتقال می دهد) و نه مقداردهی های اولیه (initialization).
مثال ۱ و ۲ دو نتیجه ی کامل متفاوت را بدست می دهند.
۱
نمونه سه
?
۱
۲
۳
۴
۵
var x = 5; // Initialize x
var y = 7; // Initialize y
elem = document.getElementById(“demo”); // Find an element
elem.innerHTML = x + ” ” + y;
۲
نمونه چهار
?
۱
۲
۳
۴
۵
۶
var x = 5; // Initialize x
elem = document.getElementById(“demo”); // Find an element
elem.innerHTML = x + ” ” + y; // Display x and y
var y = 7; // Initialize y
آیا این امر که متغیر y در مثال دوم undefined یا تعریف نشده می باشد، معقول و منطقی به نظر می رسد؟
این به این خاطر است که تنها تعریف متغیر (declaration) (var y) و نه مقداردهی اولیه ی (initialization) آن (=۷) به بالای حوزه منتقل شده است.
در حقیقت به دلیل hoisting (انتقال تعریف متغیر به بالای scope)، متغیر y پیش از اینکه مورد استفاده قرار بگیرد، اعلان یا تعریف شده و همچنین به این خاطر که مقدار متغیر مورد نظر نیز به همراه تعریف آن به بالا منتقل نمی شود، مقدار متغیر مزبور undefined تلقی می گردد.
مثال دوم را اینگونه نیز می توان نوشت.
نمونه پنج
?
۱
۲
۳
۴
۵
۶
۷
var x = 5; // Initialize x
var y; // Declare y
elem = document.getElementById(“demo”); // Find an element
elem.innerHTML = x + ” ” + y; // Display x and y
y = 7; // Assign 7 to y
hoisting از جمله رفتارهای زبان جاوا اسکریپت است که برای بسیاری از برنامه نویسان تحت وب ناشناخته می باشد.
چنانچه برنامه نویس هیچ ذهنیتی نسبت به این رفتار پیش فرض زبان بیان شده نداشته باشد ممکن است کدهایی که می نوسید عاری از خطا نباشند.
جهت جلوگیری از رخداد خطا در کدنویسی، توصیه می کنیم حتما متغیرهای خود را در ابتدای scope تعریف کنید.
توجه
حالت strict mode زبان جاوا اسکریپت به برنامه نویس اجازه نمی دهد متغیرها را پیش از اعلان آن ها مورد استفاده قرار دهد.
۷۸۲