জাভাস্ক্রিপ্টে এটি সংজ্ঞায়িত করার আগে আমি কেন কোনও ফাংশন ব্যবহার করতে পারি?


168

এই কোডটি সর্বদা বিভিন্ন ব্রাউজারেও কাজ করে:

function fooCheck() {
  alert(internalFoo()); // We are using internalFoo() here...

  return internalFoo(); // And here, even though it has not been defined...

  function internalFoo() { return true; } //...until here!
}

fooCheck();

যদিও এটির কাজ করা উচিত সে সম্পর্কে আমি একটি রেফারেন্স পাইনি। আমি জন রেগের উপস্থাপনা নোটে এটি প্রথম দেখেছি, তবে এটি কেবল উল্লেখ করা হয়েছিল। এই বিষয়ে সেখানে বা কোথাও কোনও ব্যাখ্যা নেই।

কেউ আমাকে আলোকিত করতে পারেন?


3
ফায়ারফক্সের নতুন সংস্করণগুলিতে কোডটি চেষ্টা / ধরার ক্ষেত্রে এটি কাজ করে না। এই ফ্রিডলটি
জোশুয়া স্মিথ

উত্তর:


217

functionঘোষণা জাদু এবং ঘটায় এটির শনাক্তকারীর এটির কোড-ব্লক * কার্যকর কিছু করার আগে আবদ্ধ হতে।

এটি একটি functionএক্সপ্রেশন সহ একটি কার্যক্রমে পৃথক , যা সাধারণ শীর্ষ-নীচে ক্রমে মূল্যায়ন করা হয়।

আপনি যদি উদাহরণটি পরিবর্তন করে বলেন:

var internalFoo = function() { return true; };

এটা কাজ বন্ধ হবে।

ফাংশন ঘোষণাটি প্রায় একইরকম দেখায় এবং কিছু ক্ষেত্রে অস্পষ্ট হতে পারে তবুও ফাংশন ঘোষণাটি ফাংশন এক্সপ্রেশন থেকে সিনট্যাকটিকভাবে বেশ আলাদা।

এটি ECMAScript স্ট্যান্ডার্ড , বিভাগ 10.1.3 এ নথিভুক্ত করা হয়েছে । দুর্ভাগ্যক্রমে ECMA-262 মানক-মানদণ্ডের দ্বারা খুব বেশি পঠিত দলিল নয়!

*: সমন্বিত ফাংশন, ব্লক, মডিউল বা স্ক্রিপ্ট।


আমার ধারণা এটি সত্যিই পঠনযোগ্য নয়। আপনি কেবল 10.1.3 এ নির্দেশিত বিভাগটি পড়েছি এবং সেখানকার বিধানগুলি কেন এই আচরণের কারণ হবে তা পাইনি। তথ্যের জন্য ধন্যবাদ.
এডু ফেলিপ

2
@ ববিন্স ওকে, আমি যখন এই পৃষ্ঠায় "উত্তোলন" শব্দটির কোনও উল্লেখ খুঁজে পাইনি, তখন আমি নিজেকে সন্দেহ করতে শুরু করি। আশা করি এই মন্তব্যগুলিতে জিনিসগুলি ঠিক করার জন্য পর্যাপ্ত গুগল জুস রয়েছে
Math

2
এটি একটি জনপ্রিয় প্রশ্ন / উত্তর কম্বো। ES5 টিকা বিশদের সাথে একটি লিঙ্ক / অংশের সাথে আপডেট করার কথা বিবেচনা করুন। (যা কিছুটা বেশি অ্যাক্সেসযোগ্য))

1
এই নিবন্ধটির কয়েকটি উদাহরণ রয়েছে: জাভাস্ক্রিপ্ট-স্কোপিং এবং
হোস্টিং

আমি সংক্ষিপ্ততার আগে বেশ কয়েকটি গ্রন্থাগারটি ফাংশনটি ব্যবহার করতে দেখেছি, এমনকি কিছু ভাষা এটি আনুষ্ঠানিকভাবে অনুমতি দেয়, প্রাক্তন। Haskell,। সত্যি কথা বলতে কী, এটি কোনও খারাপ জিনিস নাও হতে পারে, যেহেতু আপনি কিছু ক্ষেত্রে কিছুটা বেশি ভাবপূর্ণ লিখতে পারেন।
উইন্ডমায়াও

28

এটিকে হোস্টিং বলা হয় - সংজ্ঞায়িত হওয়ার আগে একটি ক্রিয়াকলাপটি আহ্বান করা (কল করা)।

দুটি ভিন্ন ধরণের ফাংশন যা আমি লিখতে চাই তা হ'ল:

এক্সপ্রেশন ফাংশন এবং ঘোষণা ফাংশন

  1. এক্সপ্রেশন ফাংশন:

    ফাংশন এক্সপ্রেশনগুলি একটি ভেরিয়েবলে সংরক্ষণ করা যায় যাতে তাদের ফাংশন নামের প্রয়োজন হয় না। তাদের একটি নামহীন ফাংশন (নাম ব্যতীত একটি ফাংশন) হিসাবেও নাম দেওয়া হবে।

    এই ক্রিয়াকলাপগুলি আহ্বান করতে (কল করতে) তাদের সর্বদা একটি পরিবর্তনশীল নাম প্রয়োজন । এই ধরণের ফাংশন কাজ করবে না যদি এটি সংজ্ঞায়িত হওয়ার আগে ডাকা হয় যার অর্থ এখানে হোস্টিং হচ্ছে না। আমাদের অবশ্যই সর্বদা অভিব্যক্তি ফাংশনটি প্রথমে সংজ্ঞায়িত করতে হবে এবং তারপরে এটি শুরু করতে হবে।

    let lastName = function (family) {
     console.log("My last name is " + family);
    };
    let x = lastName("Lopez");

    এভাবে আপনি এটি ECMAScript 6 এ লিখতে পারেন:

    lastName = (family) => console.log("My last name is " + family);
    
    x = lastName("Lopez");
  2. ঘোষণা কার্যাদি:

    নিম্নলিখিত সিনট্যাক্স সহ ঘোষিত কার্যগুলি তাত্ক্ষণিকভাবে কার্যকর করা হয় না। এগুলি "পরবর্তী ব্যবহারের জন্য সংরক্ষণ করা হয়েছে" এবং যখন তাদের ডাকা হবে (ডাকা হবে) তখন তা কার্যকর করা হবে। এই ধরণের ফাংশনটি যদি আপনি এটিকে আগে বা তার পরে সংজ্ঞায়িত করা হয় বলে কল করেন তবে কাজ করে। আপনি যদি কোনও ঘোষণা ফাংশনটি সংজ্ঞায়িত করার আগে কল করেন তবে হোস্টিং সঠিকভাবে কাজ করে।

    function Name(name) {
      console.log("My cat's name is " + name);
    }
    Name("Chloe");

    উত্তোলনের উদাহরণ:

    Name("Chloe");
    function Name(name) {
       console.log("My cat's name is " + name);
    }

let fun = theFunction; fun(); function theFunction() {}এছাড়াও কাজ করবে (নোড এবং ব্রাউজারগুলি)
ফাইডার

14

ব্রাউজারটি আপনার এইচটিএমএলটি শুরু থেকে শেষ অবধি পড়ে এবং এটি কার্যকর করা যায় এবং এটিকে এক্সিকিউটেবল অংশগুলিতে (পরিবর্তনশীল ঘোষণা, ফাংশন সংজ্ঞা, ইত্যাদি) পার্স করার সাথে সাথে এটি কার্যকর করতে পারে তবে যে কোনও বিন্দুতে স্ক্রিপ্টের মধ্যে যা সংজ্ঞায়িত হয়েছে তা কেবলমাত্র সেই বিন্দুর আগেই ব্যবহার করতে পারে।

এটি অন্যান্য প্রোগ্রামিং প্রসঙ্গে যা আপনার সমস্ত উত্স কোড প্রসেস করে (সংকলন) করে, সম্ভবত আপনার রেফারেন্সগুলি সমাধান করার জন্য প্রয়োজনীয় যে কোনও লাইব্রেরির সাথে এটি যুক্ত করুন এবং এক্সিকিউটেবল মডিউলটি তৈরি করুন, যেখানে এগুলি কার্যকর করা শুরু হয়।

আপনার কোড নামকৃত অবজেক্টগুলিকে (ভেরিয়েবলস, অন্যান্য ফাংশন, ইত্যাদি) উল্লেখ করতে পারে যা আরও বরাবর সংজ্ঞায়িত করা হয়েছে তবে সমস্ত টুকরো উপলব্ধ না হওয়া পর্যন্ত আপনি রেফারিং কোডটি কার্যকর করতে পারবেন না।

আপনি জাভাস্ক্রিপ্টের সাথে পরিচিত হওয়ার সাথে সাথে আপনি যথাযথ ক্রমে জিনিসগুলি লেখার প্রয়োজনীয়তার সম্পর্কে ঘনিষ্ঠভাবে সচেতন হয়ে উঠবেন।

পুনর্বিবেচনা: গৃহীত উত্তর (উপরে) নিশ্চিত করতে, ওয়েব পৃষ্ঠার স্ক্রিপ্ট বিভাগে পদক্ষেপ নিতে ফায়ারব্যাগ ব্যবহার করুন। এটি কোনও কোড কার্যকর করার আগে আপনি কেবল প্রথম লাইনে গিয়ে এটি ফাংশন থেকে ফাংশন এড়িয়ে যেতে দেখবেন।


3

কিছু ভাষার প্রয়োজনীয়তা রয়েছে যা ব্যবহারের আগে সনাক্তকারীকে সংজ্ঞায়িত করতে হবে। এর একটি কারণ হ'ল সংকলক উত্সকোডে একটি একক পাস ব্যবহার করে।

তবে যদি একাধিক পাস হয় (বা কিছু চেক স্থগিত করা হয়) তবে আপনি সেই প্রয়োজনীয়তা ছাড়াই পুরোপুরি বেঁচে থাকতে পারেন। এই ক্ষেত্রে, কোডটি সম্ভবত প্রথমে পঠিত (এবং ব্যাখ্যা করা) হবে এবং তারপরে লিঙ্কগুলি সেট করা হবে।


2

আমি কেবল জাভাস্ক্রিপ্টটি একটু ব্যবহার করেছি। এটি সাহায্য করবে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আপনি যা বলছেন তার সাথে এটি খুব মিল দেখাচ্ছে এবং এটি কিছুটা অন্তর্দৃষ্টি দিতে পারে:

http://www.dustindiaz.com/javascript-function-declaration-ambiguity/


লিঙ্কটি আর মারা যায় না।
mwclarke

1
লিঙ্কটি মারা গেছে।
জেরোম ইন্ডিফেনজো

এখানে আর্কাইভ.অর্গ থেকে একটি স্ন্যাপশট । মনে হচ্ছে লেখক পুরানো কন্টেন্ট থাকার জন্য তাদের পুরো ওয়েবসাইটটি সরিয়ে ফেলেছে, এই ব্লগ পোস্টটি সেই বিভাগে আসে না।
jkmartindale

1

"অভ্যন্তরীণফু" ফাংশনের মূল অংশটি বিশ্লেষণের সময় কোথাও যেতে হবে, সুতরাং যখন জেএস দোভাষী দ্বারা কোডটি (ওরফে পার্সিং) পাঠ করা হয়, তখন ফাংশনের জন্য ডেটা স্ট্রাকচার তৈরি হয় এবং নাম নির্ধারিত হয়।

কেবলমাত্র পরে, তারপর কোডটি চালানো হয়, জাভাস্ক্রিপ্ট আসলে "অভ্যন্তরীণফু" আছে কিনা এবং এটি কী এবং এটি কল করা যেতে পারে কিনা তা অনুসন্ধান করার চেষ্টা করে etc.


-4

একই কারণে নিম্নলিখিতগুলি সর্বদা fooবিশ্বব্যাপী নেমস্পেসে রাখবে:

if (test condition) {
    var foo;
}

8
আসলে, এটি খুব ভিন্ন কারণে different ifব্লক, একটি সুযোগ তৈরি করা একটি সময় নেই function()ব্লক সবসময় এক সৃষ্টি। আসল কারণটি হ'ল বৈশ্বিক জাভাস্ক্রিপ্ট নামের সংজ্ঞা সংকলন পর্যায়ে ঘটে, যাতে কোডটি না চালানো হলেও নামটি সংজ্ঞায়িত করা হয়। (দুঃখিত, মন্তব্য করতে এত দিন লেগেছে)
এডু ফিলিপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.