Skip to content

The old "var" #28

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Nov 3, 2019
Prev Previous commit
Next Next commit
changes done
  • Loading branch information
lhmisho committed Oct 23, 2019
commit f258c4a3b2dd54afd01836262617760d31a45914
26 changes: 13 additions & 13 deletions 1-js/06-advanced-functions/04-var/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@

লেক্সিকাল এনভায়রনমেন্টের ক্ষেত্রে `let` এবং `const` ঠিক একইভাবে আচরণ করে।

কিন্তু `var` সম্পূর্ণ ভিন্ন, যা খুব পুরানো কাল থেকেই উদ্ভূত হয়েছিল। এটি সাধারণত আধুনিক স্ক্রিপ্টগুলিতে ব্যবহৃত হয় না তবে এটি পুরানো স্ক্রিপ্টগুলিতে লুকিয়ে থাকে
কিন্তু `var` সম্পূর্ণ ভিন্ন, যা খুব পুরানো কাল থেকেই উদ্ভূত হয়েছিল। এটি সাধারণত আধুনিক স্ক্রিপ্টগুলিতে ব্যবহৃত হয় না তবে এটি পুরানো স্ক্রিপ্টগুলিতে সচরাচর দেখা যাবে

আপনি যদি এই জাতীয় স্ক্রিপ্টগুলি সম্পর্কে জানার পরিকল্পনা না করেন তবে আপনি এই অধ্যায়টি এড়িয়ে যেতে পারেন, তবে তা আপনাকে পরে সমসসায় ফেলতে পারে।
আপনি যদি এই জাতীয় স্ক্রিপ্টগুলি সম্পর্কে জানার পরিকল্পনা না করেন তবে আপনি এই অধ্যায়টি এড়িয়ে যেতে পারেন, তবে তা আপনাকে পরে সমস্যায় ফেলতে পারে।

প্রথমদিকে দেখতে `var` এর আচরন `let` এর মতো হয়ে থাকে। সেটা হলো একটি ভেরিয়েবল ঘোষণা করাঃ
প্রথমদিকে দেখতে varlet এর আচরণ একই রকম মনে হবে। সেটা হলো একটি ভেরিয়েবল ঘোষণা করাঃ

```js run
function sayHi() {
Expand Down Expand Up @@ -45,7 +45,7 @@ alert(test); // true, "if" ব্লকের বাইরেও এটি ব
*/!*
```

`Var` কোড ব্লকগুলিকে উপেক্ষা করার সাথে সাথে আমরা একটি গ্লোবাল `test` ভেরিয়েবল পেয়েছি.
`var` কোড ব্লকগুলিকে উপেক্ষা করার সাথে সাথে আমরা একটি গ্লোবাল `test` ভেরিয়েবল পেয়েছি.

যদি আমরা `var test` এর পরিবর্তে `let test` ব্যবহার করি, তবে ভেরিয়েবলটি কেবল `if` ব্লকের মধ্যে সীমাবদ্ধ থাকবেঃ

Expand Down Expand Up @@ -88,11 +88,11 @@ alert(phrase); // এরর: phrase নির্ধারণ করা নেই

আমারা যেটা দেখলাম, `var` - `if`, `for` অথবা অন্য ব্লক ভেদ করে বাইরে আসতে পারে। তার কারন অনেক আগে জাভাস্ক্রিপ্টে কোন লেক্সিকাল এনভাইরমেন্ট ছিল না। এবং `var` তারই একটি অংশ।

## "VAR" ফাংশনের শুরুতেই ঘোষিত হয়।
## "var" ফাংশনের শুরুতেই ঘোষিত হয়।

ফাংশনের শুরুতেই `var` ঘোষিত হয়ে যায়(অথবা স্ক্রিপ্ট গ্লোবালের জন্য শুরু হয়)

অন্যভাবে বলা যায়, `var` ভেরিয়্যবলগুলো ফাংশনের শুরুতেই ঘোষিত হয়, সেটাকে যেখানেই সংজ্ঞায়িত করা হোক না কেন(ধরে নিলাম এটি কোন নেস্টেড ফাংশনের মধ্যে নয়)।
অন্যভাবে বলা যায়, `var` ভেরিয়্যবল গুলো ফাংশনের শুরুতেই ঘোষিত হয়, সেটাকে যেখানেই সংজ্ঞায়িত করা হোক না কেন(ধরে নিলাম এটি কোন নেস্টেড ফাংশনের মধ্যে নয়)।

তাহলেঃ

Expand Down Expand Up @@ -141,12 +141,14 @@ function sayHi() {
sayHi();
```

লোকেরা এ জাতীয় আচরণকে "উত্তোলন - hoisting" (উত্থাপন) নামেও অভিহিত করে, কারণ সমস্ত `var` ফাংশনের শীর্ষে "উত্তোলিত" (উত্থাপিত) হয়।
লোকেরা এ জাতীয় আচরণকে "hoisting" নামেও অভিহিত করে, কারণ সমস্ত var ফাংশনের শীর্ষে "hoisting" হয়।

সুতরাং উপরের উদাহরণে, `if(false)` কখনও কার্যকর হয় না, কিন্তু এতে কোন সমস্যা নেই। ফাংশনের শুরুতে এর অভ্যন্তরের `var` প্রসেস হয়ে যায়, সুতরং `(*)` মুহূর্তে ভেরিয়েবলটি বিদ্যমান থাকে।

**ডিকলারেশন গুলো "hoisted" হলেও, কিন্তু "assignment" হয় না**

একটি উদাহরণ দিয়ে দিয়ে দেখা যাক, যেমনঃ

```js run
function sayHi() {
alert(phrase);
Expand All @@ -162,17 +164,14 @@ sayHi();
`var phrase` = "Hello" লাইনটির মধ্যে দুটি কাজ রয়েছেঃ
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
`var phrase` = "Hello" লাইনটির মধ্যে দুটি কাজ রয়েছেঃ
`var phrase = "Hello"` লাইনটির মধ্যে দুটি কাজ রয়েছেঃ


১। ভেরিয়েবল ঘোষণা `var`

২। ভেরিয়াবল আসাইনমেন্ট `=`।

ঘোষণাটি ফাংশনের শুরুতে প্রক্রিয়া করা হয় ("hoisted"),
তবে অ্যাসাইনমেন্টটি সর্বদা যেখানে প্রদর্শিত হবে সেখানে কাজ করে। সুতরাং কোডটি মূলত এই ভাবে কাজ করে:
ফাংশন এক্সিকিউশনের শুরুতেই ডিক্লেয়ার করা হয়ে থাকে ("hoisted"),তবে অ্যাসাইনমেন্টটি সর্বদা যেখানে প্রদর্শিত হবে সেখানে কাজ করে। সুতরাং কোডটি মূলত এই ভাবে কাজ করে:

```js run
function sayHi() {
*!*
var phrase; //
ঘোষণাটি শুরুতেই কাজ করে...
var phrase; // ভেরিয়েবল ডিক্লেয়ার শুরুতেই কাজ করে ...
*/!*

alert(phrase); // undefined
Expand All @@ -181,10 +180,11 @@ function sayHi() {
phrase = "Hello"; // ...অ্যাসাইনমেন্ট - যখন এক্সিকিউশন এখানে পৌঁছায়।
*/!*
}

sayHi();
```

কারন সকল `var` ফাংশনের শুরুতেই ঘোষিত হয়, আমরা যে কোনও জায়গায় তাদের রেফারেন্স করতে পারি। কিন্তু অ্যাসাইনমেন্টের আগ পর্যন্ত ভেরিয়্যবলগুলো আনডিফাইন থাকে।
কারন সকল var ফাংশনের শুরুতেই ডিক্লেয়ার করা হয়, আমরা ওই ফাংশন স্কোপের যে কোন জায়গায় থেকে ভেরিয়েবল সমূহ কে ব্যবহার করতে পারি। কিন্তু অ্যাসাইনমেন্টের আগ পর্যন্ত ভেরিয়েবল গুলো আনডিফাইন অবস্থায় থাকে।

উপরের দুটি উদাহরণে `alert` কোন এরর ছাড়াই চলে, কারন ভেরিয়েবল `phrase` বিদ্যমান রয়েছে। তবে এর মান এখনও নির্ধারিত হয়নি, সুতরাং এটি আনডিফাইন দেখায়।

Expand Down