এসআই তীর ফাংশনগুলিতে কখন আমি "রিটার্ন" ব্যবহার করব?


154

নতুন es6 তীর ফাংশন বলতে returnকিছু পরিস্থিতিতে কার্যকর অন্তর্নিহিত হল:

এক্সপ্রেশনটিও সেই ফাংশনের অন্তর্নিহিত রিটার্ন মান।

কোন ক্ষেত্রে আমার returnএস 6 টি তীরের ফাংশনগুলি ব্যবহার করতে হবে ?

উত্তর:


262

জ্যাকসন আংশিকভাবে একই প্রশ্নের উত্তর দিয়েছেন :

অন্তর্নিহিত রিটার্ন, তবে কোনও ব্লক না থাকলে কেবল।

  • এটির ত্রুটি ঘটবে যখন একটি-লাইনার একাধিক লাইনে প্রসারিত হয় এবং প্রোগ্রামার একটি যুক্ত করতে ভুলে যায় return
  • অন্তর্নিহিত রিটার্ন সিন্টেক্সিকভাবে অস্পষ্ট। (name) => {id: name}জিনিস ফেরত দেয় {id: name}... তাই না? ভুল। এটি ফিরে আসে undefined। এই ধনুর্বন্ধনী একটি স্পষ্ট ব্লক। id:একটি লেবেল

আমি এটি একটি ব্লকের সংজ্ঞা যুক্ত করব :

একটি ব্লক স্টেটমেন্ট (বা অন্য ভাষায় যৌগিক বিবৃতি) শূন্য বা আরও বেশি বিবৃতিগুলিকে গোষ্ঠী করতে ব্যবহৃত হয়। ব্লকটি এক জোড়া কোঁকড়ানো বন্ধনী দ্বারা সীমিত করা হয়।

উদাহরণ :

// returns: undefined
// explanation: an empty block with an implicit return
((name) => {})() 

// returns: 'Hi Jess'
// explanation: no block means implicit return
((name) => 'Hi ' + name)('Jess')

// returns: undefined
// explanation: explicit return required inside block, but is missing.
((name) => {'Hi ' + name})('Jess')

// returns: 'Hi Jess'
// explanation: explicit return in block exists
((name) => {return 'Hi ' + name})('Jess') 

// returns: undefined
// explanation: a block containing a single label. No explicit return.
// more: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label
((name) => {id: name})('Jess') 

// returns: {id: 'Jess'}
// explanation: implicit return of expression ( ) which evaluates to an object
((name) => ({id: name}))('Jess') 

// returns: {id: 'Jess'}
// explanation: explicit return inside block returns object
((name) => {return {id: name}})('Jess') 

আমি এই সিনট্যাক্সটি পাই না .. আপনি কি ক্লাস লিটারালাল ব্যবহার করে একটি ক্লাস তৈরি করছেন এবং তারপরে কোনও যুক্তি ('জেস') দিয়ে কোনও ইমপ্লিড কনস্ট্রাক্টরকে কল করছেন ?? আমি ভেবেছিলাম আপনি এটি ((নাম) => ({আইডি: 'জেস'}))
মাইকেল দাউসমান

3
@ মিশেলডৌসমান এটি একটি তীর ফাংশন যার একটি প্যারামিটার রয়েছে, nameফাংশনটি বন্ধনীতে আবদ্ধ এবং একটি যুক্তি "জেস" দিয়ে অনুরোধ করা হয়েছে। প্রতিটি ক্ষেত্রে =>এবং এর )('Jess')মধ্যে কোড হ'ল তীর ফাংশনের মূল অংশ। এটিকে ফর্মের তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশনের একটি সংক্ষিপ্ত রূপের মতো বিবেচনা করুন(function (name) { return { id: name } })('Jess')
রাশ ক্যাম

খুব উপকারী! প্রতিশ্রুতিগুলির সমস্যাগুলিতে সহায়তা করে an সমস্ত মানচিত্রটি একটি তীর ফাংশন সহ আইটেমগুলির উপরে পড়ে এবং আপনি লক্ষ্য করতে পারেন যে তীর ফাংশনগুলির সাথে অ্যারের উপরে ম্যাপিংয়ের জন্য যদি কোনও মান ফেরত না পাওয়া যায় তবে আপনি অপরিজ্ঞিত একটি অ্যারে পান কিনা তা লক্ষ্য করতে পারেন।
জয় শাহ

তীর ফাংশনগুলির জন্য অন্তর্নিহিত রিটার্ন পদ্ধতিতে তৈরি করার নেতিবাচক দিকটি কী ছিল? ঠিক কফিস্ক্রিপ্ট যেমন করে ... (যদিও আমি কফিসিপিটি পছন্দ করি না)
অগাস্টিন রিডঞ্জার

4
স্পষ্টরূপে মনে হচ্ছে, যেহেতু জেএস পার্সার কোনও অভিব্যক্তি (যেমন কোনও বস্তুর আক্ষরিক ধারণাগুলি {}) বা কোনও ব্লক প্রত্যাশা করবেন কিনা তা জানেন না , এটি ধরে নিয়েছে যে { }একটি ব্লককে চিহ্নিত করে। এর অর্থ এই যে এটি যখন দেখবে id: name, তখন এটি মনে করে যে id:একটি লেবেল তৈরি করা একটি অভিব্যক্তি (প্রবাহ নিয়ন্ত্রণের সাথে জড়িত জেএসের একটি খুব অস্বাভাবিকভাবে ব্যবহৃত বৈশিষ্ট্য এবং এটি ব্যবহার করে :) এবং তারপরে nameনিম্নলিখিতটি id:কেবল একটি পৃথক বিবৃতি যা কেবলমাত্র ভেরিয়েবল name(এবং & কিছুই করে না)।
আয়নো

18

আমি এই নিয়মটি বুঝতে পারি ...

কার্যকরভাবে রূপান্তরকারী ফাংশনগুলির জন্য (যুক্তিগুলির এক-লাইন-ম্যানিপুলেশনস), রিটার্ন অন্তর্ভুক্ত।

প্রার্থীরা হলেন:

// square-root 
value => Math.sqrt(value)

// sum
(a,b) => a+b

অন্যান্য ক্রিয়াকলাপের জন্য (এক-লাইনারের বেশি যে ব্লকের প্রয়োজন রয়েছে, তাদের ফেরত স্পষ্ট করতে হবে


11

এখানে আরও একটি মামলা আছে।

প্রতিক্রিয়ায় একটি কার্যকরী উপাদান লেখার সময়, আপনি স্পষ্টত ফেরত জেএসএক্সকে মোড়ানোর জন্য প্রথম বন্ধনী ব্যবহার করতে পারেন।

const FunctionalComponent = () => (
  <div>
    <OtherComponent />
  </div>
);

4
আপনি সর্বদা বন্ধনী ব্যবহার করতে পারেন, এটি জেএসএক্স বা প্রতিক্রিয়ার সাথে সম্পর্কিত নয়
এমিল বার্গারন

4

এখানে আরও একটি মামলা যা আমাকে কিছুটা সমস্যা দিয়েছে।

// the "tricky" way
const wrap = (foo) => (bar) => {
  if (foo === 'foo') return foo + ' ' + bar;
  return 'nofoo ' + bar;
}

এখানে আমরা একটি বেনামে ফাংশন ফিরিয়ে ফাংশনটি সংজ্ঞায়িত করেছি " যেহেতু এটি না, নিখুঁত রিটার্ন কিক করে।

মোড়ানো কীভাবে কার্যকর হবে তা এখানে:

// use wrap() to create a function withfoo()
const withfoo = wrap('foo');
// returns: foo bar
console.log(withfoo('bar'));

// use wrap() to create a function withoutfoo()
const withoutfoo = wrap('bar');
// returns: nofoo bar
console.log(withoutfoo('bar'));

আমি এটি যেভাবে খুলেছি তা নিশ্চিত করার জন্য এটি যেভাবে করা হয়েছিল তা হ'ল কার্যগুলি "অকার্যকরকরণ"।

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

// the explicit return way
const wrap = (foo) => {
  return (bar) => {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  }
}

মোড়কের সম্পূর্ণ অদৃশ্য সংস্করণটি এর মতো হবে, যা চর্বিযুক্ত তীরযুক্ত সংস্করণের মতো কমপ্যাক্ট নয়, অনুধাবন করা অনেক সহজ বলে মনে হচ্ছে।

// the "no arrow functions" way
const wrap = function(foo) {
  return function(bar) {
    if (foo === 'foo') return foo + ' ' + bar;
    return 'nofoo ' + bar;
  };
};

শেষ পর্যন্ত, অন্যদের জন্য যা আমার কোডটি পড়তে পারে এবং আমাকে ভবিষ্যত করতে পারে, আমি মনে করি যে আমি নন তীর সংস্করণটি পছন্দ করতে চাই যা প্রথমে এক নজরে দৃশ্যমানভাবে অনুধাবন করা যায়, তীরের চেয়ে একটি ন্যায্য বিট নেয় one ভাবার (এবং আমার ক্ষেত্রে পরীক্ষায়) ভাবার জন্য।


3

তীর ফাংশন আপনাকে অন্তর্ভুক্ত ফেরত দেওয়ার অনুমতি দেয়: মানগুলি ব্যবহার না করেই মানগুলি ফিরে আসে returned return

ফাংশন বডিটিতে একটি অন-লাইন স্টেটমেন্ট উপস্থিত থাকলে এটি কাজ করে:

const myFunction = () => 'test'

console.log(myFunction()) //'test'

আর একটি উদাহরণ, কোনও বস্তু ফিরিয়ে দেওয়া (কার্পেট বন্ধনীগুলিকে মোড়ানো কার্যকারণের দেহের বন্ধনী হিসাবে বিবেচনা করা এড়াতে প্যারেন্টেসিসে মোড়ানো মনে রাখবেন):

const myFunction = () => ({value: 'test'})

console.log(myFunction()) //{value: 'test'}


1
এটি সঠিক উত্তর হওয়া উচিত, যদিও আরও কিছুটা ব্যাখ্যা প্রয়োজন। মূলত যখন ফাংশন বডি একটি অভিব্যক্তি হয়, কোনও ব্লক নয়, তখন এই অভিব্যক্তিটির মান অন্তর্নিহিতভাবে ফিরে আসে। আমি ভুল হলে শুধরে.
পল-সেবাস্তিয়ান মানোলে 27'19
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.