জাভাস্ক্রিপ্ট নেস্টেড ফাংশন


97

আমি জাভাস্ক্রিপ্টের জন্য একটি কোডের টুকরো পেয়েছি যা আমি ঠিক বুঝতে পারি না:

function dmy(d) {
    function pad2(n) {
        return (n < 10) ? '0' + n : n;
    }

    return pad2(d.getUTCDate()) + '/' +
       pad2(d.getUTCMonth() + 1) + '/' +
       d.getUTCFullYear();
}

function outerFunc(base) {
    var punc = "!";

    //inner function
    function returnString(ext) {
       return base + ext + punc;
    }

    return returnString;
}

অন্য ফাংশনের মধ্যে কোনও ফাংশনকে কীভাবে সংজ্ঞায়িত করা যায়? আমি আমার () ফাংশনের বাইরে থেকে প্যাড 2 () কল করতে পারি?

দয়া করে এটিতে কিছু আলোকপাত করুন। ধন্যবাদ


13
ফাংশন ফাংশন ভিতরে তৈরি করা যেতে পারে। এটি পুরোপুরি বৈধ।
0x499602D2

উত্তর:


141

ফাংশন জাভাস্ক্রিপ্টে অন্য ধরণের ভেরিয়েবল (অবশ্যই কিছু ঘনত্ব সহ)। অন্য ফাংশনের মধ্যে একটি ফাংশন তৈরি করা একইভাবে ফাংশনের পরিধি পরিবর্তন করে এটি একটি ভেরিয়েবলের ক্ষেত্র পরিবর্তন করতে পারে। মোট বিশ্বব্যাপী নেমস্পেস দূষণ কমাতে ক্লোজারগুলির সাথে ব্যবহারের জন্য এটি বিশেষত গুরুত্বপূর্ণ।

অন্য ফাংশনের মধ্যে সংজ্ঞায়িত ফাংশনগুলি ফাংশনের বাইরে অ্যাক্সেসযোগ্য হবে না যদি না তারা ফাংশনের বাইরে অ্যাক্সেসযোগ্য কোনও বস্তুর সাথে সংযুক্ত না থাকে:

function foo(doBar)
{
  function bar()
  {
    console.log( 'bar' );
  }

  function baz()
  {
    console.log( 'baz' );
  }

  window.baz = baz;
  if ( doBar ) bar();
}

এই উদাহরণে, বাজ ফাংশনটি fooওভাররাইড করা হওয়ায় ফাংশনটি চালুর পরে ব্যবহারের জন্য উপলব্ধ হবে window.baz। বার ফাংশনটি ফাংশনের মধ্যে থাকা স্কোপগুলি ব্যতীত অন্য কোনও প্রসঙ্গে উপলব্ধ হবে না foo

ভিন্ন উদাহরণ হিসাবে:

function Fizz(qux)
{
  this.buzz = function(){
    console.log( qux );
  };
}

Fizzফাংশন একটি কন্সট্রাকটর যাতে যখন চালানো, এটি একটি নির্ধারণ হিসাবে ডিজাইন করা হয়েছে buzzফাংশন নব নির্মিত বস্তু।


উইন্ডো.বাজ = বাজ কী? কেন এই লাইন এম? কে বাজ উপলব্ধ?
জিয়াং জাং

@ জিয়াংজ্যাং, সেই কোড ব্লকের পরের অনুচ্ছেদের ব্যাখ্যা রয়েছে, সেখানে কি কোনও বিশেষ অংশ অস্পষ্ট ছিল?
zzzzBov

35

একে ক্লোজার বলা হয় ।

মূলত, অন্যান্য ফাংশনের মধ্যে সংজ্ঞায়িত ফাংশনটি কেবল এই ফাংশনের মধ্যেই অ্যাক্সেসযোগ্য। তবে ফলাফল হিসাবে পাস হতে পারে এবং তারপরে এই ফলাফলটি বলা যেতে পারে।

এটি একটি খুব শক্তিশালী বৈশিষ্ট্য। আপনি এখানে আরও ব্যাখ্যা দেখতে পারেন:

আর্কাইভ.আর.জে জাভাস্ক্রিপ্ট_ক্লোজারস_ডম্মি.এসটিএমএল মিরর


13
function x() {}

এর সমতুল্য (বা খুব অনুরূপ)

var x = function() {}

আমি ভুল না হলে।

সুতরাং মজার কিছু চলছে না।


8
প্রথম বাক্য গঠনটি নথির শুরুতে সরানো হবে। সুতরাং ফান্টটি শুরু করার আগে ফাংশনটিকে 'x' বলা যেতে পারে।
টম

10
প্রথম বাক্য
গঠনটি

@TheZ আমার মনে হয় ক্রোম সম্প্রতি ডিবাগিংয়ের জন্য ফাংশনটির নাম যুক্ত করেছে যাতে আপনি সাধারণ ক্ষেত্রে আগের মতো মাথা ব্যথা না পান।
জিঙ্গলেস্তুলা

জিঞ্জেলস্টুলা হ্যাঁ! ক্রোম কিছুক্ষণ আগে এই নামটি যুক্ত করেছে এবং এটি অনেক প্রশংসা করেছে :)
TheZ

10

ফাংশনগুলির ভিতরে এবং বাইরে ফাংশন-ইনস্ট্যান্টেশন অনুমোদিত allowed ভেরিয়েবলগুলির মতো এই ফাংশনগুলির অভ্যন্তরে নেস্টেড ফাংশনগুলি স্থানীয় এবং তাই বাইরের সুযোগ থেকে প্রাপ্ত করা যায় না।

function foo() {
    function bar() {
        return 1;
    }
    return bar();
}

fooনিপূণভাবে ব্যবহার করেন barনিজেই মধ্যে। barবাহ্যিক ক্ষেত্র থেকে সংজ্ঞায়িত না করা হলে বাহ্যিক ক্ষেত্র থেকে স্পর্শ করা যায় না।

সুতরাং এটি কাজ করবে না:

function foo() {
    function bar() {
        return 1;
    }
}

bar(); // throws error: bar is not defined

4

আপনি যখন কোনও ফাংশনের মধ্যে কোনও ফাংশন ঘোষণা করেন, তখন অভ্যন্তরীণ ফাংশনগুলি কেবলমাত্র তাদের ঘোষিত স্কোপগুলিতে পাওয়া যায় বা আপনার ক্ষেত্রে, pad2কেবলমাত্র সেই dmyসুযোগে ডাকা যেতে পারে ।

বিদ্যমান সমস্ত ভেরিয়েবলগুলি এর মধ্যে dmyদৃশ্যমান pad2তবে এটি অন্যভাবে হয় না: ডি


2

জাভাস্ক্রিপ্টে (এবং অনেক ভাষায়) ফাংশনগুলির ভিতরে ফাংশন রাখা একেবারে স্বাভাবিক।

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


0

function foo() {
  function bar() {
    return 1;
  }
}
bar();

একটি ত্রুটি নিক্ষেপ করবে। যেহেতু barভিতরে সংজ্ঞায়িত করা হয়েছে foo, barকেবলমাত্র ভিতরে প্রবেশযোগ্য হবে foo
ব্যবহার করার জন্য barআপনাকে এটি ভিতরে চালানো দরকার foo

function foo() {
  function bar() {
    return 1;
  }
  bar();
}

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.