জাভাস্ক্রিপ্টে ফাংশন নির্ধারণের জন্য কনস্টের সঠিক ব্যবহার


181

constজাভাস্ক্রিপ্ট-নির্দিষ্ট ফাংশনগুলিতে কি ধরণের মান নির্ধারণ করা যেতে পারে তার সীমাবদ্ধতা থাকলে আমি আগ্রহী । এটা কি বৈধ? অনুমোদিত যে এটি কাজ করে, তবে এটি কোনও কারণে খারাপ অনুশীলন হিসাবে বিবেচিত হয়?

const doSomething = () => {
   ...
}

সমস্ত ফাংশন ES6 এ এভাবে সংজ্ঞায়িত করা উচিত? এটি যদি ধরা পড়ে তবে মনে হয় না।

কোন মন্তব্যের জন্য ধন্যবাদ!


আপনি একাধিক প্রশ্ন জিজ্ঞাসা করছেন বলে মনে হচ্ছে: 1) "জাভাস্ক্রিপ্টে" নং 2) কনস্ট্যান্ড ব্যবহার করে কোন ধরণের মান নির্ধারণ করা যেতে পারে তার কোনও সীমাবদ্ধতা থাকলে আমি আগ্রহী "এটি কি বৈধ?" হ্যাঁ. 3) "এটি কোনও কারণে খারাপ অনুশীলন হিসাবে বিবেচিত হয়" আমার ধারণা এটি সম্পর্কে দীর্ঘকাল ধরে কিছু বলার অপেক্ষা রাখে না তবে কেন প্যাড অনুশীলন হওয়া উচিত তা আমি দেখছি না। এটি থেকে খুব আলাদা নয় var doSomething = <function def>;। 4) "সমস্ত ফাংশনগুলিকে ES6 এ এভাবে সংজ্ঞায়িত করা উচিত?" আমার কাছে কষ্টকর মনে হচ্ছে। আমি ফাংশন ঘোষণা পছন্দ করি। প্রত্যেকে তাদের নিজস্ব।
ফেলিক্স ক্লিং

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

4
আমি অনুমান করি যে প্রশ্নটি আপনি কী দিয়ে অর্জন করতে চান const। আপনি কি নিজেকে ফাংশনটি ওভাররাইড করা থেকে বিরত রাখতে চান? আমি ধরে নিচ্ছি যে আপনার কোডটি যাহাই হউক না কেন এটি জানেন। আপনি কি অভিপ্রায়টি প্রকাশ করতে চান doSomething, অর্থাৎ এটি কোনও ফাংশন ধারণ করে এবং এর মান পরিবর্তন করে না? আমি মনে করি ফাংশন ঘোষণাগুলিও এই অভিপ্রায়টি স্পষ্টভাবে যোগাযোগ করে। সুতরাং, যদি আপনার ওভাররাইড থেকে "রানটাইম সুরক্ষা" দরকার হয় তবে এর জন্য যান। অন্যথায় আমি খুব বেশি সুবিধা দেখছি না। অবশ্যই আপনি যদি প্রাথমিকভাবে ব্যবহার করতে চান তবে var foo = function() {};আমি constপরিবর্তে ব্যবহার করব var
ফেলিক্স ক্লিং

5
@ ফেলিক্সক্লিং, "আমি ধরে নিচ্ছি যে আপনার কোডটি যাহাই হউক না কেন know" - এটি বেশ খারাপ যুক্তি। নাহলে মোটেই বুদ্ধি নেই const
meandre

উত্তর:


249

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

একটি ফাংশন ঘোষণা, যা:

function doSomething () {}

পুরো ক্ষেত্রের শীর্ষে উত্তোলন করা হয় (এবং এটি পছন্দ করে letএবং constসেগুলিও ব্লক করা হয়)।

এর অর্থ নিম্নলিখিতটি কাজ করবে:

doSomething() // works!
function doSomething() {}

একটি ফাংশন এক্সপ্রেশন, যা:

[const | let | var] = function () {} (or () =>

একটি বেনামী ফাংশন তৈরি করা (function () {} ) এবং একটি ভেরিয়েবলের সৃষ্টি এবং তারপরে সেই ভেরিয়েবলের কাছে সেই বেনাম ফাংশনটির অ্যাসাইনমেন্ট।

সুতরাং কোনও স্কোপের মধ্যে ভেরিয়েবল উত্তোলনের চারপাশের সাধারণ নিয়মগুলি - ব্লক-স্কোপড ভেরিয়েবলগুলি ( letএবং const) undefinedতাদের ব্লক স্কোপের শীর্ষে উঠানো হয় না ।

এর অর্থ:

if (true) {
    doSomething() // will fail
    const doSomething = function () {}
}

doSomethingসংজ্ঞায়িত না হওয়ায় ব্যর্থ হবে । (এটি একটি নিক্ষেপ করবে ReferenceError)

আপনি যদি varভেরিয়েবলটি উত্তোলন করতে ব্যবহার করে সরে যান তবে এটির সূচনা হবে undefinedযাতে উপরের কোডের ব্লকটি এখনও কাজ না করে। (এটি TypeErrorযেহেতু doSomethingআপনি কল করবেন তখন এটি কোনও কার্য নয়)

স্ট্যান্ডার্ড অনুশীলনগুলি যতদূর যায়, আপনার কাজের জন্য সর্বদা সঠিক সরঞ্জামটি ব্যবহার করা উচিত।

অ্যাক্সেল রাউশমায়ারের এএস se শব্দার্থবিজ্ঞান সহ স্কোপ এবং উত্তোলনের বিষয়ে দুর্দান্ত পোস্ট রয়েছে: ES6 এ চলক এবং স্কোপিং


7
ক্লাসের নামটিকে ক্লাসের মধ্যে পুনরায় নিয়োগ দেওয়া থেকে রক্ষা করতে এসআইএস ক্লাসগুলি অভ্যন্তরীণভাবে কনস্ট ব্যবহার করে।
ব্যবহারকারী 2342460

1
মধ্যে একটি সূক্ষ্ম পার্থক্য একটি function a(){console.log(this);} এবং const a=_=>{console.log(this);} যদি আপনি এটা পছন্দ কল a.call(someVar);, ইন একটি , এটা মুদ্রণ করবে someVar, এ বি , এটা মুদ্রণ করবে window
কিয়ান চেন

99

যদিও constফাংশনগুলি সংজ্ঞায়িত করার জন্য ব্যবহার হ্যাকের মতো মনে হয় তবে কিছু দুর্দান্ত সুবিধার সাথে এটি আসে যা এটি উচ্চতর করে তোলে (আমার মতে)

  1. এটি ফাংশনটিকে অপরিবর্তনীয় করে তোলে তাই আপনাকে অন্য কোনও কোডের কোড দ্বারা সেই ফাংশনটি পরিবর্তন করার বিষয়ে চিন্তা করতে হবে না।

  2. আপনি চর্বিযুক্ত তীর সিনট্যাক্স ব্যবহার করতে পারেন যা কম এবং ক্লিনার।

  3. তীর ফাংশন thisব্যবহার করা আপনার জন্য বাইন্ডিংয়ের যত্ন নেয় ।

সঙ্গে উদাহরণ function

// define a function
function add(x, y) { return x + y; }

// use it
console.log(add(1, 2)); // 3

// oops, someone mutated your function
add = function (x, y) { return x - y; };

// now this is not what you expected
console.log(add(1, 2)); // -1

একই উদাহরণ const

// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;

// use it
console.log(add(1, 2)); // 3

// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged


1
এবং আপনি দুবার ফাংশন অ্যাড ঘোষণা করতে পারেন (x, y), তবে আপনি দুবার
কনস্ট

33
1. অপরিচ্ছন্নতা একটি আসল সুবিধা, তবে কারও পক্ষে কোনও ফাংশনকে ওভাররাইট করা খুব বিরল। ২. ফ্যাট অ্যার সিনট্যাক্সটি কম নয় যদি না আপনার ফাংশনটি এক্সপ্রেশন হতে পারে। function f(x, y) {18 টি অক্ষর, const f = (x, y) => {21 অক্ষর, তাই 3 অক্ষর দীর্ঘ। ৩. এই বাধ্যবাধকতাটি কেবল তখনই গুরুত্বপূর্ণ যদি ফাংশনগুলি কোনও পদ্ধতির (বা অন্যান্য ক্রিয়াকলাপে যার অর্থ হয়) এর মধ্যে সংজ্ঞায়িত হয়। শীর্ষ স্তরের স্ক্রিপ্টে এটি অর্থহীন। আমি আপনাকে ভুল বলছি না, কেবল যে কারণে আপনি উল্লেখ করেছেন তা অত্যন্ত প্রাসঙ্গিক নয়।
নেকেডিবল

@ নাকিবল তাই অন্য কিছু বৈধ কারণ কি?
আনিস রামস্বামী

13
পুরানো ফ্যাশন ফাংশন সিনট্যাক্সের একটি সুবিধা এটি ডিবাগ করার সময় হয় name
ব্যবহারকারী949300

3
আমি ফাংশন ঘোষণাকে পুনরায় বাইন্ডিং আটকাতে লটারগুলি ব্যবহার করব।
ফ্রাঙ্কলিন ইউ

31

এই প্রশ্নটি জিজ্ঞাসা করার পরে তিন বছর হয়ে গেছে, তবে আমি এখনই এটি জুড়ে আসছি। যেহেতু এই উত্তরটি এখন পর্যন্ত স্ট্যাকের নিচে রয়েছে, দয়া করে আমাকে এটির পুনরাবৃত্তি করার অনুমতি দিন:

প্রশ্ন: জাভাস্ক্রিপ্টে কনস্ট্যান্ড ব্যবহার করে কোন ধরণের মান নির্ধারণ করা যেতে পারে তার সীমাবদ্ধতা রয়েছে কিনা তা সম্পর্কে আমি আগ্রহী particular নির্দিষ্ট ফাংশনে const এটা কি বৈধ? অনুমোদিত যে এটি কাজ করে, তবে এটি কোনও কারণে খারাপ অনুশীলন হিসাবে বিবেচিত হয়?

আমি এক দেখে পরে কিছু গবেষণা করতে প্রেরণা ছিল উর্বর জাভাস্ক্রিপ্ট সংকেতপদ্ধতিরচয়িতা যারা সবসময় ব্যবহার constজন্য বিবৃতি functions, এমনকি যখন কোন আপাত কারণে / উপকার।

" এটি কোনও কারণে খারাপ অনুশীলন হিসাবে বিবেচিত হয়? " এর উত্তরে আমি বলতে পারি, আইএমও, হ্যাঁ এটি, বা কমপক্ষে বিবৃতি ব্যবহারের সুবিধা রয়েছে function

আমার কাছে মনে হয় এটি মূলত পছন্দ এবং শৈলীর বিষয়। উপরে কিছু ভাল যুক্তি উপস্থাপন করা হয়েছে, তবে এই নিবন্ধে যেমনটি করা হয়েছে তেমন পরিষ্কার কিছুই নেই:

ধ্রুবক বিভ্রান্তি: কেন আমি এখনও জাভাস্ক্রিপ্ট ফাংশন বিবৃতি মিডিয়াম.ফ্রেইকডেক্যাম্প.আর. / বিভাজন দ্বারা ব্যবহার করি, জাভাস্ক্রিপ্ট গুরু, পরামর্শক এবং শিক্ষক।

আমি নিবন্ধটি সবাইকে পড়ার জন্য অনুরোধ করছি, আপনি ইতিমধ্যে সিদ্ধান্ত নিয়ে থাকলেও।

এখানে মূল বিষয়গুলি:

ফাংশন বিবৃতিগুলির [কনস্ট্যান্ট] ফাংশন এক্সপ্রেশনগুলির চেয়ে দুটি সুস্পষ্ট সুবিধা রয়েছে:

সুবিধা # 1: অভিপ্রায়ের স্পষ্টতা

দিনে কয়েক হাজার লাইনের কোড স্ক্যান করার সময়, প্রোগ্রামারটির অভিপ্রায়টি যত তাড়াতাড়ি সম্ভব এবং তাত্ক্ষণিকভাবে চিহ্নিত করার পক্ষে এটি কার্যকর।

সুবিধা # 2: ঘোষণার আদেশ == কার্যকর করার আদেশ

আদর্শভাবে, আমি আমার কোডটি কমপক্ষে ক্রম হিসাবে ঘোষণা করতে চাই যে আমি আশা করি এটি কার্যকর হয়ে যাবে।

এটি আমার জন্য শোস্টোপার: কনস্টিভ কীওয়ার্ড ব্যবহার করে ঘোষিত কোনও মান কার্যকর না হওয়া অবধি অ্যাক্সেসযোগ্য।

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

আমার মস্তিষ্ক সেভাবে কাজ করে না। আমি বিশদের আগে প্রসঙ্গটি চাই।

সর্বাধিক কোড মানব দ্বারা রচিত। সুতরাং এটি বোঝা যায় যে বেশিরভাগ লোকের বোঝার ক্রম মোটামুটি বেশিরভাগ কোডের মৃত্যুদন্ডের আদেশ অনুসরণ করে।


1
অভিপ্রায়ের স্পষ্টতা সম্পর্কে আপনি কি আরও কিছু মন্তব্য করতে পারেন? আমি # 2 পেয়েছি, তবে আমি যতটা বলতে পারি # 1 কেবল # 2 এর পুনরায় (পূর্ব?) পুনরাবৃত্তি। আমি একটি কেস সম্পর্কে চিন্তা করতে পারি, অর্থাত্ defaultErrorHandlerএকটি অনামী ফাংশন হিসাবে তাদের নিজস্ব নির্ধারিত ক্রিয়াকলাপগুলি যা আমি তারপরে প্রতিশ্রুতি পরিচালনাকারীদের কাছ থেকে কল করতে পারি। এটি আমাকে প্রয়োজন হিসাবে ফাংশনগুলির মধ্যে এই ডিফল্ট ত্রুটি হ্যান্ডলারটি বিকল্পভাবে 'ওভাররাইড' করতে সক্ষম করবে। কারও কারও কাছে একটি ত্রুটিযুক্ত বস্তু ফিরে আসতে হবে এবং অন্যদের ভার্বোসিটির বিভিন্ন স্তরের একটি HTTP প্রতিক্রিয়া ফিরিয়ে দিতে হবে। তবুও কোড কাঠামো নির্বিশেষে একটি পরিচিত প্যাটার্ন হতে পারে।
জ্যাক টি।

যদিও আমার ধারণাটি খুব সংশ্লেষিত! কিছু নতুন অনুশীলনকে ঘিরে আমার মাথাটি কেবল মুড়িয়ে ফেলা হয়েছে, সেগুলি বাস্তবায়নের জন্য এখনও অনেক বেশি সময় ব্যয় করেননি। স্রেফ সন্ধান করা আমি .then( res.success, res.error )যে অনামী নামগুলিতে কেবল কল করার ঘোষণা দিয়েছিলাম তার চেয়ে অনেক বেশি পছন্দ করি res.success(value);.then( ..., defaultErrorHandler)শীর্ষ স্তরের সংজ্ঞায়িত ডিফল্ট এরিরহ্যান্ডলার ফাংশন সহ একটি সাধারণ প্যাটার্ন থাকা ভাল হতে পারে এবং const defaultErrorHandler = error => { ... }পছন্দসই হিসাবে কোনও ফাংশন স্কোপের মধ্যে optionচ্ছিকভাবে একটি ঘোষিত থাকতে পারে ।
জেক টি।

1
@JakeT। আর "আপনি কি অভিপ্রায়ের স্পষ্টতা সম্পর্কে আরও কিছু মন্তব্য করতে পারেন?" ঠিক আছে, প্রথমত, উক্ত বিবৃতিটি আমার তৈরি করা হয়নি, তবে ফ্রিকোডেক্যাম্প.আর. / বিল দ্বারা এই নিবন্ধটির লেখক। তবে এটি আমার কাছে সত্যিকারের সাধারণ জ্ঞান তৈরি করে। যদি আমি "ফাংশন আগামীকাল ()" পড়ি তবে আমি অবিলম্বে জানি এটি একটি ফাংশন। তবে আমি যদি "কনস্টে আগামীকাল = () =>" পড়ি তবে আমি এক মুহুর্তের জন্য থামলাম এবং অবশেষে নির্ধারণ করতে আমার মাথায় বাক্য গঠন পার্স করে ফেললাম, ঠিক আছে, হ্যাঁ, এটি একটি ফাংশন।
জে মিচেলটিএক্স

1
আরেকটি জিনিস, যদি আমার কাছে অন্য কারও দ্বারা লিখিত একটি দীর্ঘ স্ক্রিপ্ট থাকে এবং আমি সমস্ত ফাংশন দেখতে চাই, তবে সেগুলি সন্ধান করার জন্য আমি "ফাংশন" এ একটি দ্রুত অনুসন্ধান করতে পারি। বা আরও ভাল, আমি সমস্ত ফাংশন নিষ্কাশন করার জন্য একটি দ্রুত জেএস RegEx লিখতে পারি। আইএমও, "কনস্ট" বিবৃতিটি কেবলমাত্র ডেটা (ফাংশন নয়) এর জন্য যা পরিবর্তন হবে না NOT
জে মিচেলটিএক্স

10

এর ব্যবহারে কিছু খুব গুরুত্বপূর্ণ সুবিধা রয়েছে constএবং কেউ কেউ বলবেন এটি যতটা ইচ্ছাকৃত এবং ইঙ্গিতযুক্ত তা এটি যেখানেই সম্ভব ব্যবহার করা উচিত।

এটি যতদূর আমি বলতে পারি, জাভাস্ক্রিপ্টের মধ্যে ভেরিয়েবলগুলির সর্বাধিক নির্দেশক এবং অনুমানযোগ্য ঘোষণা এবং এটি কতটা সীমাবদ্ধ তার কারণ হিসাবে সবচেয়ে কার্যকর। কেন? কারণ এটি উপলভ্য varএবং সম্ভাব্য কিছু সম্ভাবনা দূর করে let

আপনি যখন পড়েন তখন আপনি কী অনুমান করতে পারেন const? আপনি কেবলমাত্র constঘোষণার বিবৃতিটি পড়ে এবং সেই পরিবর্তকের অন্যান্য রেফারেন্সগুলির জন্য স্ক্যান না করেই নীচের সমস্তগুলি জানেন:

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

নিম্নলিখিত উদ্ধৃতি থেকে একটি নিবন্ধ সুবিধাগুলো তর্ক letএবং const। কীওয়ার্ডের সীমাবদ্ধতা / সীমাবদ্ধতা সম্পর্কে এটি আরও সরাসরি আপনার প্রশ্নের উত্তর দেয়:

যেমন দ্বারা প্রদত্ত মতো সীমাবদ্ধতাসমূহ letএবং constকোড বুঝতে সহজ তৈরীর একটি শক্তিশালী উপায়। আপনার লিখিত কোডটিতে যতগুলি সম্ভব সীমাবদ্ধতার অনেকগুলি অর্জন করার চেষ্টা করুন। কোডের টুকরোটি কী বোঝাতে পারে তার সীমাবদ্ধতার অধিকতর ঘোষণামূলক বাধা, মানুষের পক্ষে ভবিষ্যতে কোডের একটি অংশটি পড়ার, পার্স করা এবং বোঝার পক্ষে সহজ এবং দ্রুত।

মঞ্জুর, constঘোষণার চেয়ে কোনও ঘোষণার আরও নিয়ম রয়েছে var: ব্লক-স্কোপড, টিডিজেড, ঘোষণার সময় বরাদ্দ করুন, পুনরায় নিয়োগ দেওয়া হবে না। যখন varবিবৃতি কেবল ফাংশন স্কোপিংয়ের সংকেত দেয়। বিধি-গণনা অবশ্য প্রচুর অন্তর্দৃষ্টি দেয় না। জটিলতার ক্ষেত্রে এই নিয়মগুলি ওজন করা আরও ভাল: নিয়মটি জটিলতা যুক্ত করে বা বিয়োগ করে? এর ক্ষেত্রে const, ব্লক স্কোপিং অর্থ ফাংশন স্কোপিংয়ের চেয়ে সংকীর্ণ সুযোগ, টিডিজেডের অর্থ হ'ল ঘোষণার আগে ব্যবহার স্পট করার জন্য আমাদের ঘোষণা থেকে স্কোপ পিছনের দিকে স্ক্যান করার দরকার নেই, এবং কার্যবিধির বিধিগুলির অর্থ হ'ল বাঁধাই সর্বদা রক্ষা করবে একই রেফারেন্স।

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

এই যুক্তিগুলি মাথায় রেখে, আপনি যখনই constসম্ভব সেখানে ব্যবহার করার পরামর্শ দেওয়া হচ্ছে , কারণ এটি বিবৃতিটি আমাদের ভাবতে সবচেয়ে কম সম্ভাবনা দেয়।

সূত্র: https://ponyfoo.com/articles/var-let-const

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