কোডওয়ারস সলিউশন - একে অপরের উপর কাজ করা ফাংশন নেস্টেড [বন্ধ]


11

আমি কোডওয়ারের ধাঁধাটির সমাধান খুঁজছিলাম এবং এটি কেন কাজ করে তা আমি বুঝতে পারি না। বিয়োগ () কীভাবে কাজ করছে?

function makeNum(num, func) {
    if (func === undefined) {
        return num;
    } else {
        return func(num);
    }
}

function three(func) {
    return makeNum(3, func);
}

function eight(func) {
    return makeNum(8, func);
}

function minus(right) {
    return function(left) {
        return left - right;
    };
}

console.log(eight(minus(three()))); // will log out 5


এখানে কিছুটা ভিন্ন পদ্ধতির সাথে একই রকম প্রশ্ন যা এটি কীভাবে কাজ করে তার উপর কিছুটা আলোকপাত করতে সহায়তা করতে পারে
নিক পার্সসন

1
আমি পর্যালোচনা নিরীক্ষণ হিসাবে এটি ব্যর্থ হওয়ার পরে এটি বন্ধ করার পক্ষে ভোট দিয়েছি: আপনি এটি সম্পর্কে কী বুঝতে পারেন নি তা আমার কাছে স্পষ্ট ছিল না। আপনি কেন ভাবেন বিয়োগের কাজ করা উচিত নয় তা ব্যাখ্যা করে সম্পাদনা করা ভাল better
জিএস -

উত্তর:


8

এটি কিছুটা জটিল। :-)

console.log(eight(minus(three()))); ভিতরে থেকে চালিত হয়, সুতরাং আসুন এর মাধ্যমে অনুসরণ করুন:

  • three()- কল করে makeNum(3, undefined)এবং যা ফিরে আসে তা ফেরত দেয়। makeNum(3, undefined)রিটার্ন 3, সুতরাং যে ফিরে মূল্য।
  • minus(3)- কল minus, 3হিসাবে হিসাবে পাস rightminusএকটি নতুন ফাংশন দেয় যা বন্ধ হয়ে যায় right
  • eight(...)- কলগুলি makeNum(8, fnFromMinus)যেখানে fnFromMinusফাংশনটি দিয়ে ফিরে এসেছে minus(3)makeNum(8, fnFromMinus)না fnFromMinusএ ক্ষণস্থায়ী, 8যেমন leftfnFromMinusফলাফল দেখায় left - right(মনে রাখবেন যে rightহয় 3, fnFromMinusএটি উপর বন্ধ)।

যেহেতু 8 - 3হয় 5চূড়ান্ত ফল 5, যা console.logআয়।

এখানে একটি চালিত সংস্করণ:


2

আপনি যদি ধাপে ধাপে কাজ করে থাকেন তবে এটি আসলে জটিল নয়। আসুন ভিতরে থেকে কাজ করা যাক। কল করা হচ্ছে:

three()

প্যারামিটার ব্যতীত আপনি ফানক হিসাবে একটি অপরিজ্ঞাত মান পাস করছেন। সুতরাং এটি বলার মতোই:

makeNum(3, undefined)

মেকনাম যখন দেখেন যে ফানক অপরিজ্ঞাপিত, তখন এটি সংখ্যা ফিরে আসে, যা 3।

সুতরাং আমরা এটিকে কমিয়ে রেখেছি:

eight(minus(3))

এখন দেখা যাক কিভাবে

minus(3)

মূল্যায়ন করে। বিয়োগটি দেখতে পাবে যে আপনি সরবরাহ করেছেন যে প্যারামিটারটি 3, তাই এটি এমন একটি ফাংশন দেয় যা একটি "বাম" পরামিতি গ্রহণ করতে পারে এবং আমরা ইতিমধ্যে এটি সরবরাহ করেছিলাম 3 কে বিয়োগ করতে পারে। এটি কার্যকর করা হয় না। এটি কেবল সেখানে বসে আছে, "বাম" প্যারামিটার সহ কল ​​করার জন্য অপেক্ষা করছে যাতে এটি এটি থেকে 3 টি বিয়োগ করতে পারে।

সুতরাং আমরা এটিকে কমিয়ে রেখেছি:

eight(function(left){
    return left - 3;
})

এখন দেখা যাক এটি কীভাবে মূল্যায়ন করে। আটটিকে ফানক প্যারামিটার এই ফাংশন হিসাবে ডাকা হয়:

function(left){
    return left - 3;
}

এটি তখন 8 এবং এই ফাংশনটিকে মেকনামে পাস করে যখন বলে:

makeNum(8, func)

MakeNum তারপরে দেখেছে যে ফানক সরবরাহ করা হয়েছে (এবং তাই অপরিবর্তিত নয়) এবং ফানক (নাম) আটটি ফাংশনে ফিরিয়ে দেয়, যা পাশ করার মতোই:

8 - 3

আট ফাংশন ফিরে। আটটি ফাংশনটি সেই মানটি পায় এবং তারপরে এটি প্রদান করে। সুতরাং আমরা এটিকে কমিয়ে রেখেছি:

5

যা কনসোলে লগইন হয়।


0

minusএতে পরামিতিগুলি ক্যাপচার হওয়ার সাথে সাথে প্রতিটি অনুরোধের জন্য একটি নতুন ফাংশন প্রদান করে। যখন ফেরত ফাংশন বলা হয় তখন এটি কল করা প্যারামিটারগুলিকে রেফারেন্স করতে পারে, এতে কোনও প্যারামিটার পাশ করা ছাড়াও। এটি জাভাস্ক্রিপ্টে কার্যগুলি ফাংশন করার এক উপায়।


0

এই কোডটি জেএস-এর মতো ক্রিয়ামূলক প্রোগ্রামিং ভাষার উচ্চতর ক্রিয়াকলাপগুলির উদাহরণ। জাভাস্ক্রিপ্ট ফাংশনগুলি অবজেক্ট হিসাবে বিবেচিত হয় এবং সেগুলি পাস এবং ফিরেও পাওয়া যায়।

একটি উচ্চ-আদেশ ফাংশন এমন একটি ফাংশন যা আর্গুমেন্ট হিসাবে কোনও ফাংশন গ্রহণ করে বা ফাংশনটিকে আউটপুট হিসাবে প্রদান করে।

minusএকটি বেনাম ( কোনও সংজ্ঞায়িত নাম ছাড়া একটি ফাংশন ) মূলত:

function(left) {
        return left - 3; //right = 3
    };

এই ফাংশনটি পাস করার পরে eightবলা হয় func(8)যা ফলাফল দেয়5


0

এটি দেখার আরও একটি উপায় - আপনি এই লাইনটি আবার লিখতে পারেন:

console.log(eight(minus(three())));

হিসাবে:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.