tl; dr যদি আপনি সবকিছু লোড না করা পর্যন্ত কিছু কল না করেন, আপনার ভাল হওয়া উচিত।
সম্পাদনা করুন: একটি সংক্ষিপ্তসার জন্য যা কিছু ES6 ঘোষণাপত্রও অন্তর্ভুক্ত করে ( let, const): https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Scope_Cheatsheet
এই অদ্ভুত আচরণ উপর নির্ভর করে
- আপনি কীভাবে কার্যকারিতা সংজ্ঞায়িত করেন এবং
- আপনি যখন তাদের কল।
এখানে কিছু উদাহরণ।
bar(); //This won't throw an error
function bar() {}
foo(); //This will throw an error
var foo = function() {}
bar();
function bar() {
foo(); //This will throw an error
}
var foo = function() {}
bar();
function bar() {
foo(); //This _won't_ throw an error
}
function foo() {}
function bar() {
foo(); //no error
}
var foo = function() {}
bar();
এটি উত্তোলন নামক কোনও কারণে !
ফাংশন সংজ্ঞায়িত করার দুটি উপায় রয়েছে: ফাংশন ডিক্লেয়ারেশন এবং ফাংশন এক্সপ্রেশন । পার্থক্যটি বিরক্তিকর এবং মিনিট, সুতরাং আসুন আমরা এই সামান্য ভুল জিনিসটি বলি: আপনি যদি এটি এটি লিখতে থাকেন তবে function name() {}এটি একটি ঘোষণা এবং আপনি যখন এটির মতো লিখেন var name = function() {}(বা কোনও বেনামে ফাংশন যেমন একটি জিনিসকে অর্পণ করা হয়েছে) তবে এটি এটি it's একটি ফাংশন এক্সপ্রেশন ।
প্রথমে আসুন কীভাবে ভেরিয়েবলগুলি পরিচালনা করা হয় তা দেখুন:
var foo = 42;
//the interpreter turns it into this:
var foo;
foo = 42;
এখন, কীভাবে ফাংশন ঘোষণাগুলি পরিচালনা করা হয়:
var foo = 42;
function bar() {}
//turns into
var foo; //Insanity! It's now at the top
function bar() {}
foo = 42;
varবিবৃতি "ছোঁড়ার" সৃষ্টি এর fooখুব শীর্ষে, কিন্তু এখনো এটা মান নির্ধারণ করে না। ফাংশন ঘোষণাটি পরের লাইনে আসে এবং শেষ পর্যন্ত একটি মান নির্ধারিত হয় foo।
এবং এই সম্পর্কে কি?
bar();
var foo = 42;
function bar() {}
//=>
var foo;
function bar() {}
bar();
foo = 42;
শুধু ঘোষণা এর fooউপরে সরিয়ে নেওয়া হয়েছে। অ্যাসাইনমেন্টটি কল করার পরে কেবল আসে bar, যেখানে এটি সমস্ত উত্তোলনের আগে ঘটেছিল।
এবং পরিশেষে, সংক্ষিপ্ততার জন্য:
bar();
function bar() {}
//turns to
function bar() {}
bar();
এখন, ফাংশন এক্সপ্রেশন সম্পর্কে কি ?
var foo = function() {}
foo();
//=>
var foo;
foo = function() {}
foo();
নিয়মিত ভেরিয়েবল মত, প্রথম fooহয় ঘোষিত সুযোগ সর্বোচ্চ বিন্দুতে, তাহলে এটি একটি মান নির্ধারিত হয়।
দ্বিতীয় উদাহরণটি ত্রুটি কেন ছুঁড়ে দেখা যাক।
bar();
function bar() {
foo();
}
var foo = function() {}
//=>
var foo;
function bar() {
foo();
}
bar();
foo = function() {}
যেমনটি আমরা আগেও দেখেছি, কেবল তৈরি fooকরা উত্তোলন করা হয়, অ্যাসাইনমেন্টটি আসে যেখানে এটি "আসল" (অন-উত্তোলিত) কোডে উপস্থিত হয়েছিল। যখন barডাকা হয়, এটির আগে fooএকটি মান নির্ধারিত হয় foo === undefined। এখন ফাংশন-বডিটিতে bar, এটি এমন হয় যেন আপনি করছেন undefined()যা একটি ত্রুটি ছুড়ে দেয়।