رفتار Hoisting در جاوا اسکریپت
در کدنویسی جاوا اسکریپت، میتوان یک متغیر را بعد از آنکه مورد استفاده قرار گرفت، تعریف کرد. به عبارت دیگر، میتوان از یک متغیر قبل از تعریف کردن، استفاده کرد.
مثال اول و دوم نتیجه یکسانی دارند.
مثال اول:
1 2 3 4 5 6 | x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// Assign 5 to x</span> elem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"demo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Find an element </span> elem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> x<span class="token punctuation">;</span> <span class="token comment">// Display x in the element</span> <span class="token keyword">var</span> x<span class="token punctuation">;</span> <span class="token comment">// Declare x</span> |
مثال دوم:
1 2 3 4 5 | <span class="token keyword">var</span> x<span class="token punctuation">;</span> <span class="token comment">// Declare x</span> x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// Assign 5 to x</span> elem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"demo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Find an element </span> elem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> x<span class="token punctuation">;</span> <span class="token comment">// Display x in the element</span> |
برای درک این مثالها شما باید اصطلاح Hoisting را درک کنید.
Hoisting رفتار پیشفرض از حرکت دادن تمام تعاریف به بالای محدوده فعلی (به بالای اسکریپت فعلی یا تابع فعلی) است.
کلمات کلیدی let
و const
در زبان جاوا اسکریپت، متغیرها و ثابتها (constants) که با کلمه کلیدی let
یا const
تعریف میشوند، hoist نیستند.
مقداردهیها (Initializations) در جاوا اسکریپت Hoist نیستند
جاوا اسکریپت فقط تعاریف Hoist را نشان میدهد، نه مقداردهی را.
مثال اول و دوم نتیجه یکسانی ندارند.
مثال اول:
1 2 3 4 5 | <span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// Initialize x</span> <span class="token keyword">var</span> y <span class="token operator">=</span> <span class="token number">7</span><span class="token punctuation">;</span> <span class="token comment">// Initialize y</span> elem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"demo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Find an element </span> elem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> x <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> y<span class="token punctuation">;</span> <span class="token comment">// Display x and y</span> |
مثال دوم:
1 2 3 4 5 6 | <span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// Initialize x</span> elem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"demo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Find an element </span> elem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> x <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> y<span class="token punctuation">;</span> <span class="token comment">// Display x and y</span> <span class="token keyword">var</span> y <span class="token operator">=</span> <span class="token number">7</span><span class="token punctuation">;</span> <span class="token comment">// Initialize y</span> |
آیا منطقی به نظر میرسد که y در آخرین مثال تعریف نشده است؟
این به این دلیل است که فقط تعاریف (var y
)، نه مقداردهی اولیه (۷=) به بالا کشیده میشود.
به علت بالا کشیدن، y قبل از استفاده تعریف شده است، اما چون مقداردهی بالا کشیده نشده است، مقدار y تعریف نشده است.
مثال دوم را میتوان به صورت زیر نوشت:
1 2 3 4 5 6 7 | <span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token comment">// Initialize x</span> <span class="token keyword">var</span> y<span class="token punctuation">;</span> <span class="token comment">// Declare y</span> elem <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getElementById</span><span class="token punctuation">(</span><span class="token string">"demo"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Find an element </span> elem<span class="token punctuation">.</span>innerHTML <span class="token operator">=</span> x <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> y<span class="token punctuation">;</span> <span class="token comment">// Display x and y</span> y <span class="token operator">=</span> <span class="token number">7</span><span class="token punctuation">;</span> <span class="token comment">// Assign 7 to y</span> |
تعریف کردن متغیر شما در بالا
Hoisting (برای بسیاری از توسعه دهندگان) یک رفتار ناشناخته یا نادیده گرفته شده از جاوا اسکریپت است.
اگر یک توسعه دهنده Hoist را درک نکند، برنامهها ممکن است با خطا مواجه شوند.
برای اجتناب از بروز خطاها، همواره تمام متغیرها را در ابتدای هر محدوده تعریف کنید.
جاوا اسکریپت در حالت strict اجازه نمیدهد که متغیرهای مورد استفاده در صورت تعریف نشدن، استفاده شوند.