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()
যা একটি ত্রুটি ছুড়ে দেয়।