var ফাংশননেম = ফাংশন () {} বনাম ফাংশন ফাংশননেম () {}


6871

আমি সম্প্রতি অন্য কারও জাভাস্ক্রিপ্ট কোড বজায় রাখা শুরু করেছি। আমি বাগগুলি স্থির করছি, বৈশিষ্ট্যগুলি যুক্ত করছি এবং কোডটি আরও পরিষ্কার করে আরও সুসংগত করার চেষ্টা করছি।

পূর্ববর্তী বিকাশকারী কার্যকারিতা ঘোষণার জন্য দুটি উপায় ব্যবহার করেছিলেন এবং এর পিছনে কোনও কারণ আছে বা না থাকলে আমি কাজ করতে পারি না।

দুটি উপায় হ'ল:

var functionOne = function() {
    // Some code
};
function functionTwo() {
    // Some code
}

এই দুটি পৃথক পদ্ধতি ব্যবহার করার কারণগুলি কী এবং প্রতিটিটির উপকারিতা কি? এমন কিছু আছে যা একটি পদ্ধতিতে করা যায় যা অন্যটির সাথে করা যায় না?


198
permadi.com/tutorial/jsFunc/index.html জাভাস্ক্রিপ্ট ফাংশন সম্পর্কে খুব ভাল পৃষ্ঠা
uzay95

67
সংশ্লিষ্ট এই হল চমৎকার নিবন্ধ নামে ফাংশন প্রকাশ
ফোগজ

12
@CMS রেফারেন্স এই নিবন্ধটি: kangax.github.com/nfe/#expr-vs-decl
Upperstage

106
আপনার দুটি সচেতন হওয়া দরকার: # 1 জাভাস্ক্রিপ্টে, ঘোষণাগুলি উত্তোলন করা হয়। মানে যে var a = 1; var b = 2;হয়ে যায় var a; var b; a = 1; b = 2। সুতরাং আপনি যখন ফাংশন ওয়ান ঘোষণা করেন, এটি ঘোষিত হয়ে যায় তবে এর মান অবিলম্বে সেট করা হয় না। ফাংশন দুটি যেহেতু কেবলমাত্র একটি ঘোষণা, এটি সুযোগের শীর্ষে রাখা হয়। # 2 ফাংশন দুটি আপনাকে নামের সম্পত্তি অ্যাক্সেস করতে দেয় এবং কোনও কিছু ডিবাগ করার চেষ্টা করার সময় এটি অনেক সহায়তা করে।
xavierm02

65
ওহ এবং বিটিডব্লিউ, সঠিক সিনট্যাক্সটি একটি ";" অ্যাসাইনমেন্টের পরে এবং ঘোষণার পরে ছাড়াই। যেমন function f(){}বনাম var f = function(){};
xavierm02

উত্তর:


5042

পার্থক্যটি হ'ল functionOneএকটি ফাংশন এক্সপ্রেশন এবং তাই কেবল তখনই সংজ্ঞায়িত হয় যখন সেই লাইনটি পৌঁছানো হয়, যেখানে functionTwoএকটি ফাংশন ঘোষণা এবং এর আশেপাশের ফাংশন বা স্ক্রিপ্ট কার্যকর হওয়ার সাথে সাথে সংজ্ঞা দেওয়া হয় ( উত্তোলনের কারণে )।

উদাহরণস্বরূপ, একটি ফাংশন এক্সপ্রেশন:

// TypeError: functionOne is not a function
functionOne();

var functionOne = function() {
  console.log("Hello!");
};

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

// Outputs: "Hello!"
functionTwo();

function functionTwo() {
  console.log("Hello!");
}

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

'use strict';    
{ // note this block!
  function functionThree() {
    console.log("Hello!");
  }
}
functionThree(); // ReferenceError


631
@ গ্রেগ: যাইহোক, পার্থক্যটি কেবল তা নয় যে তারা বিভিন্ন সময়ে পার্স হয়। মূলত, আপনার functionOneকেবল একটি ভেরিয়েবল যা এর কাছে একটি বেনাম ফাংশন বরাদ্দ করা হয়েছে, যদিও functionTwoএটি আসলে একটি নামকৃত ফাংশন। .toString()পার্থক্য দেখতে উভয়কে কল করুন। এটি এমন কিছু ক্ষেত্রে তাত্পর্যপূর্ণ যেখানে আপনি প্রোগ্রামের মাধ্যমে কোনও ফাংশনের নাম পেতে চান।
জেসন বুটিং 21

6
: @Jason Bunting .. নিশ্চিত না তুমি এখানে এ পেয়ে করছি, .toString () মূলত উভয়ের জন্য একই মান (ফাংশন ডেফিনেশন) আসতে বলে মনে হয় cl.ly/2a2C2Y1r0J451o0q0B1B
জন z- র

124
দুটোই আলাদা। প্রথমটি একটি function expressionদ্বিতীয়টি হ'ল ক function declaration। আপনি এখানে এই বিষয়ে আরও পড়তে পারেন: javascriptweblog.wordpress.com/2010/07/06/…
মিশাল কুকলিস

127
@ গ্রেগ পার্স টাইম বনাম রান সময় সম্পর্কিত আপনার উত্তরের অংশটি সঠিক নয়। জাভাস্ক্রিপ্টে, ফাংশন ঘোষণাগুলি পার্স সময়ের সময়ে সংজ্ঞায়িত হয় না, তবে রান সময়কালে হয়। প্রক্রিয়াটি এর মতো হয়: উত্স কোডটি পার্স করা হয়েছে -> জাভাস্ক্রিপ্ট প্রোগ্রামটি মূল্যায়ন করা হয় -> বিশ্ব নির্বাহের প্রেক্ষাপটটি সূচনা করা হয় -> ডিক্লারেশন বাইন্ডিং ইনস্ট্যান্টেশন সম্পাদিত হয়। এই প্রক্রিয়া চলাকালীন ফাংশন ঘোষণাগুলি তাত্ক্ষণিকভাবে চালিত হয় ( অধ্যায় 10.5 এর 5 ম পদক্ষেপ দেখুন )।
Vidime Vidas

102
এই ঘটনার পরিভাষা উত্তোলন হিসাবে পরিচিত।
কলিন পিয়ার

1941

প্রথমে আমি গ্রেগকে সংশোধন করতে চাই: function abc(){}এটিও স্কোপড - নামটি abcএমন সংজ্ঞা দেওয়া হয় যেখানে এই সংজ্ঞাটি সংঘটিত হয়। উদাহরণ:

function xyz(){
  function abc(){};
  // abc is defined here...
}
// ...but not here

দ্বিতীয়ত, উভয় শৈলী একত্রিত করা সম্ভব:

var xyz = function abc(){};

xyzএটি যথারীতি সংজ্ঞায়িত হতে চলেছে, abcসমস্ত ব্রাউজারে অপরিজ্ঞাত তবে ইন্টারনেট এক্সপ্লোরার - এটি সংজ্ঞায়িত হওয়ার উপর নির্ভর করবেন না। তবে এটি তার দেহের ভিতরে সংজ্ঞায়িত করা হবে:

var xyz = function abc(){
  // xyz is visible here
  // abc is visible here
}
// xyz is visible here
// abc is undefined here

আপনি যদি সমস্ত ব্রাউজারগুলিতে ওরফে ফাংশন করতে চান তবে এই জাতীয় ঘোষণাটি ব্যবহার করুন:

function abc(){};
var xyz = abc;

এক্ষেত্রে xyzএবং উভয়ই abcএকই বস্তুর উপমা:

console.log(xyz === abc); // prints "true"

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

function abc(){};
console.log(abc.name); // prints "abc"

এর নাম স্বয়ংক্রিয়ভাবে নির্ধারিত হয়। আপনি যখন এটি পছন্দ হিসাবে

var abc = function(){};
console.log(abc.name); // prints ""

এর নামটি খালি - আমরা একটি বেনামে ফাংশন তৈরি করেছি এবং এটি কিছু ভেরিয়েবলের জন্য নির্ধারিত করেছি।

সম্মিলিত শৈলীটি ব্যবহারের আর একটি ভাল কারণ হ'ল বাহ্যিক ব্যবহারকারীদের জন্য দীর্ঘবিরোধী নাম সরবরাহ করার সময় নিজেকে উল্লেখ করার জন্য একটি স্বল্প অভ্যন্তরীণ নাম ব্যবহার করা:

// Assume really.long.external.scoped is {}
really.long.external.scoped.name = function shortcut(n){
  // Let it call itself recursively:
  shortcut(n - 1);
  // ...
  // Let it pass itself as a callback:
  someFunction(shortcut);
  // ...
}

উপরের উদাহরণে আমরা বাহ্যিক নামের সাথেও একই কাজ করতে পারি তবে এটি অত্যধিক স্বল্প (এবং ধীর) হবে।

(নিজেকে উল্লেখ করার আরেকটি উপায় হ'ল ব্যবহার করা arguments.calleeযা এখনও তুলনামূলকভাবে দীর্ঘ এবং কড়া মোডে সমর্থিত নয়))

গভীরভাবে ডাউন, জাভাস্ক্রিপ্ট উভয় বক্তব্যকে আলাদাভাবে আচরণ করে। এটি একটি ফাংশন ঘোষণা:

function abc(){}

abc এখানে বর্তমান সুযোগে সর্বত্র সংজ্ঞায়িত করা হয়েছে:

// We can call it here
abc(); // Works

// Yet, it is defined down there.
function abc(){}

// We can call it again
abc(); // Works

এছাড়াও, এটি একটি returnবিবৃতিতে উত্তোলন করেছে :

// We can call it here
abc(); // Works
return;
function abc(){}

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

var xyz = function(){};

xyz এখানে নিয়োগ বিন্দু থেকে সংজ্ঞায়িত করা হয়:

// We can't call it here
xyz(); // UNDEFINED!!!

// Now it is defined
xyz = function(){}

// We can call it here
xyz(); // works

ফাংশন ঘোষণা বনাম ফাংশন এক্সপ্রেশন হ'ল গ্রেগ দ্বারা প্রদর্শিত একটি পার্থক্য থাকার আসল কারণ।

মজার ব্যাপার:

var xyz = function abc(){};
console.log(xyz.name); // Prints "abc"

ব্যক্তিগতভাবে, আমি "ফাংশন এক্সপ্রেশন" ঘোষণা পছন্দ করি কারণ এইভাবে আমি দৃশ্যমানতা নিয়ন্ত্রণ করতে পারি। আমি যখন ফাংশন সংজ্ঞায়িত করি

var abc = function(){};

আমি জানি যে আমি স্থানীয়ভাবে ফাংশনটি সংজ্ঞায়িত করেছি। আমি যখন ফাংশন সংজ্ঞায়িত করি

abc = function(){};

আমি জানি যে আমি বিশ্বব্যাপী এটি সংজ্ঞায়িত করেছিলাম যে abcস্কোপের শৃঙ্খলে আমি কোথাও সংজ্ঞা দিই নি । এই শৈলীর সংজ্ঞাটি অভ্যন্তরের অভ্যন্তরে ব্যবহৃত হওয়ার পরেও স্থিতিস্থাপক eval()। সংজ্ঞা যখন

function abc(){};

প্রসঙ্গের উপর নির্ভর করে এবং এটি অনুমান করা যায় যে এটি আসলে সংজ্ঞায়িত কোথায়, বিশেষত ক্ষেত্রে eval()- উত্তরটি রয়েছে: এটি ব্রাউজারের উপর নির্ভর করে।


69
আমি রবার্গকে উল্লেখ করেছি তবে তার সন্ধান আর কোথাও নেই। সাধারণ: RoBorg === গ্রেগ। ইন্টারনেটের যুগে ইতিহাসকে এভাবেই আবার লেখা যায়। ;-)
ইউজিন লাজুতকিন

10
var xyz = ফাংশন abc () {}; কনসোল.লগ (xyz === abc); আমি যে সমস্ত ব্রাউজারগুলি পরীক্ষা করেছি (সাফারি 4, ফায়ারফক্স 3.5.5, অপেরা 10.10) আমাকে "অপরিবর্তিত ভেরিয়েবল: এবিসি" দেয়।
এনভিআই

7
সামগ্রিকভাবে আমি মনে করি এই পোস্টটি পার্থক্য এবং ফাংশন ঘোষণাকে কাজে লাগানোর সুবিধাগুলি ব্যাখ্যা করার জন্য একটি ভাল কাজ করে। আমি ভেরিয়েবলের কাছে ফাংশন এক্সপ্রেশন অ্যাসাইনমেন্ট ব্যবহারের সুবিধাগুলি যতদূর অসম্মতি জানাতে রাজি হই, বিশেষত যেহেতু "বেনিফিট" একটি বিশ্বব্যাপী সত্তা ঘোষণার পক্ষে বলে মনে হচ্ছে ... এবং সকলেই জানেন যে আপনার গ্লোবাল নেমস্পেসকে বিশৃঙ্খলা না করা উচিত knows ঠিক আছে? ;-)
natlee75

83
ইমো নামকৃত ফাংশনটি ব্যবহার করার একটি বিশাল কারণ হ'ল ডিবাগারগুলি আপনাকে আপনার কল স্ট্যাক বা স্ট্যাক ট্রেসটি উপলব্ধি করতে সহায়তা করতে নামটি ব্যবহার করতে পারে। আপনি কল স্ট্যাকের দিকে তাকান এবং "বেনামে ফাংশন" 10 টি স্তর গভীর দেখেন এটি
ছাগল

3
var abc = function(){}; console.log(abc.name);আর কোনও উত্পাদন করে না "", তবে "abc"পরিবর্তে।
কিওয়ার্টি

632

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

শর্তাবলী:

দ্রুত তালিকা:

  • কার্য ঘোষণা

  • "অজ্ঞাতনামা" functionএক্সপ্রেশন (যা শব্দ থাকা সত্ত্বেও কখনও কখনও নামের সাথে ফাংশন তৈরি করে)

  • নামকরণ functionএক্সপ্রেশন

  • অ্যাকসেসর ফাংশন ইনিশিয়ালাইজার (ES5 +)

  • তীর ফাংশন এক্সপ্রেশন (ES2015 +) (যা বেনামে ফাংশন এক্সপ্রেশনগুলির মতো, একটি স্পষ্ট নাম জড়িত না, এবং এখনও নাম সহ ফাংশন তৈরি করতে পারে)

  • অবজেক্ট ইনিশিয়ালাইজারে পদ্ধতি ঘোষণা (ES2015 +)

  • class(ES2015 +) এর মধ্যে নির্মাতা এবং পদ্ধতি ঘোষণা

কার্য ঘোষণা

প্রথম রূপটি একটি ফাংশন ঘোষণা , যা দেখতে এটির মতো দেখাচ্ছে:

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

একটি ফাংশন ঘোষণা একটি ঘোষণা ; এটি কোনও বিবৃতি বা অভিব্যক্তি নয়। যেমন, আপনি এটির সাথে অনুসরণ করেন না ;(যদিও এটি করা নিরীহ)।

কোনও ধাপে ধাপে কোড কার্যকর করার আগে , কার্যকর হওয়া প্রসঙ্গে প্রবেশের সময় একটি ফাংশন ঘোষণা প্রক্রিয়া করা হয়। এটি তৈরি করে ফাংশনটি একটি যথাযথ নাম দেওয়া হয় ( xউপরের উদাহরণে), এবং সেই নামটি সেই সুযোগে রাখা হয় যেখানে ঘোষণাপত্রটি উপস্থিত হয়।

যেহেতু এটি একই প্রসঙ্গে কোনও ধাপে ধাপে কোডের আগে প্রক্রিয়াজাত করা হয়, আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

x(); // Works even though it's above the declaration
function x() {
    console.log('x');
}

ES2015 পর্যন্ত, বৈশিষ্ট আবরণ না কি একটি JavaScript ইঞ্জিন যদি আপনি চান একটি নিয়ন্ত্রণ কাঠামোর ভিতরে একটি ফাংশন ঘোষণা করা করা উচিৎ try, if, switch, whileভালো, ইত্যাদি

if (someCondition) {
    function foo() {    // <===== HERE THERE
    }                   // <===== BE DRAGONS
}

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

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

ES2015 হিসাবে, স্পেসিফিকেশনটি কী করবে তা বলে। আসলে এটি তিনটি পৃথক জিনিস দেয়:

  1. যদি আলগা মোডে কোনও ওয়েব ব্রাউজারে না থাকে তবে জাভাস্ক্রিপ্ট ইঞ্জিনটি একটি কাজ করার কথা
  2. যদি কোনও ওয়েব ব্রাউজারে আলগা মোডে থাকে তবে জাভাস্ক্রিপ্ট ইঞ্জিনটি অন্য কিছু করার কথা
  3. যদি কড়া মোডে থাকে (ব্রাউজারটি না হয়), জাভাস্ক্রিপ্ট ইঞ্জিনটি আরও একটি কাজ করার কথা

আলগা মোডগুলির নিয়মগুলি জটিল, তবে কঠোর মোডে, ব্লকগুলিতে ফাংশন ঘোষণাগুলি সহজ: এগুলি ব্লকের স্থানীয় হয় (তাদের ব্লকের সুযোগ রয়েছে , যা ES2015 এও নতুন) এবং এগুলি শীর্ষে তোলা হয় ব্লকের তাই:

"use strict";
if (someCondition) {
    foo();               // Works just fine
    function foo() {
    }
}
console.log(typeof foo); // "undefined" (`foo` is not in scope here
                         // because it's not in the same block)

"নামবিহীন" functionএক্সপ্রেশন

দ্বিতীয় সাধারণ ফর্মটিকে একটি বেনামি ফাংশন এক্সপ্রেশন বলা হয় :

var y = function () {
    console.log('y');
};

সমস্ত এক্সপ্রেশনগুলির মতো, কোডটি ধাপে ধাপে কার্যকর করার সময় এটিকে মূল্যায়ন করা হয়।

ES5- এ, এটি তৈরি করে ফাংশনটির কোনও নাম নেই (এটি নামবিহীন)। ES2015 এ, ফাংশনটি প্রসঙ্গ থেকে অনুমান করে যদি সম্ভব হয় তবে একটি নাম নির্ধারিত হয়। উপরের উদাহরণে নামটি হবে y। অনুরূপ কিছু করা হয় যখন ফাংশনটি কোনও প্রার্টিটি আরম্ভকারীর মান। (এবং যখন এই ঘটনার বিস্তারিত বিবরণ নিয়ম জন্য অনুসন্ধান SetFunctionNameমধ্যে স্পেসিফিকেশন  - এটা মনে হচ্ছে, সব জায়গা।)

নামকরণ functionএক্সপ্রেশন

তৃতীয় রূপটি একটি নামযুক্ত ফাংশন এক্সপ্রেশন ("NFE"):

var z = function w() {
    console.log('zw')
};

এটি তৈরি করে ফাংশনটির একটি সঠিক নাম রয়েছে ( wএই ক্ষেত্রে)। সমস্ত এক্সপ্রেশনগুলির মতো, কোডটি ধাপে ধাপে কার্যকর করার সময় এটিকে মূল্যায়ন করা হয়। ক্রিয়াকলাপটির নামটি স্কোপের সাথে যুক্ত হয় না যেখানে অভিব্যক্তিটি উপস্থিত হয়; নাম হয় ফাংশন নিজেই মধ্যে সুযোগ:

var z = function w() {
    console.log(typeof w); // "function"
};
console.log(typeof w);     // "undefined"

নোট করুন যে এনএফইগুলি প্রায়শই জাভাস্ক্রিপ্ট প্রয়োগের জন্য বাগের উত্স হয়ে থাকে। উদাহরণস্বরূপ, আইই 8 এবং এর আগে, এনএফই সম্পূর্ণরূপে ভুলভাবে পরিচালনা করে , দুটি ভিন্ন সময়ে দুটি পৃথক ফাংশন তৈরি করে। সাফারির প্রাথমিক সংস্করণগুলিতেও সমস্যা ছিল। সুসংবাদটি হ'ল ব্রাউজারগুলির বর্তমান সংস্করণগুলিতে (আই 9 এবং আপ, বর্তমান সাফারি) আর সেই সমস্যাগুলি নেই। (তবে এই লেখার মতো, দুঃখের বিষয়, আইই 8 ব্যাপকভাবে ব্যবহারে রয়ে গেছে, এবং তাই ওয়েবে সাধারণভাবে কোড সহ এনএফই ব্যবহার করা এখনও সমস্যাযুক্ত))

অ্যাকসেসর ফাংশন ইনিশিয়ালাইজার (ES5 +)

কখনও কখনও ফাংশনগুলি বৃহত্তর নজরে না গিয়ে লুকিয়ে থাকতে পারে; এটি এক্সেসর ফাংশনগুলির ক্ষেত্রে । এখানে একটি উদাহরণ:

var obj = {
    value: 0,
    get f() {
        return this.value;
    },
    set f(v) {
        this.value = v;
    }
};
console.log(obj.f);         // 0
console.log(typeof obj.f);  // "number"

মনে রাখবেন যে আমি যখন ফাংশনটি ব্যবহার করেছি তখন আমি ব্যবহার করিনি ()! কারণ এটি কোনও সম্পত্তির জন্য একটি এক্সেসর ফাংশন । আমরা সম্পত্তিটি স্বাভাবিক উপায়ে সেট করি এবং সেট করি তবে পর্দার আড়ালে ফাংশনটি বলা হয়।

এছাড়াও আপনি সঙ্গে অ্যাকসেসর ফাংশন তৈরি করতে পারেন Object.defineProperty, Object.defineProperties, এবং স্বল্প-পরিচিত দ্বিতীয় যুক্তি Object.create

তীর ফাংশন এক্সপ্রেশন (ES2015 +)

ES2015 আমাদের তীর ফাংশন নিয়ে আসে । একটি উদাহরণ এখানে:

var a = [1, 2, 3];
var b = a.map(n => n * 2);
console.log(b.join(", ")); // 2, 4, 6

কলটিতে n => n * 2লুকিয়ে থাকা জিনিসটি দেখুন map()? এটি একটি ফাংশন।

তীর ফাংশন সম্পর্কে কয়েকটি জিনিস:

  1. তাদের নিজস্ব নেই this। পরিবর্তে, তারা যে প্রসঙ্গে সংজ্ঞায়িত হয়েছে তার প্রসঙ্গটি বন্ধ করে দেয় this। (এগুলিও বন্ধ হয়ে যায় argumentsএবং যেখানে প্রাসঙ্গিক হয় super।) এর অর্থ thisহ'ল তাদের thisতৈরি করা জায়গাগুলির মতোই তাদের অভ্যন্তরে রয়েছে এবং পরিবর্তন করা যায় না।

  2. আপনি উপরের সাথে লক্ষ্য করেছেন, আপনি কীওয়ার্ডটি ব্যবহার করবেন না function; পরিবর্তে, আপনি ব্যবহার =>

n => n * 2উদাহরণটি তাদের মধ্যে একজন ফর্ম। যদি ফাংশনটি পাস করার জন্য আপনার একাধিক যুক্তি থাকে তবে আপনি প্যারেন্স ব্যবহার করেন:

var a = [1, 2, 3];
var b = a.map((n, i) => n * i);
console.log(b.join(", ")); // 0, 2, 6

(মনে রাখবেন যে Array#mapপ্রথম আর্গুমেন্ট হিসাবে এন্ট্রি এবং দ্বিতীয় হিসাবে সূচকটি পাস করে)

উভয় ক্ষেত্রেই, ফাংশনটির মূল অংশটি কেবল একটি অভিব্যক্তি; ফাংশনের রিটার্ন মানটি স্বয়ংক্রিয়ভাবে সেই অভিব্যক্তির ফলাফল হবে (আপনি কোনও স্পষ্ট ব্যবহার করবেন না return)।

আপনি যদি সাধারণ হিসাবে কেবল একটি একক অভিব্যক্তি, ব্যবহার {}এবং একটি সুস্পষ্টর return(যদি আপনার কোনও মান ফেরত দেওয়ার প্রয়োজন হয়) এর চেয়ে আরও বেশি করে করছেন :

var a = [
  {first: "Joe", last: "Bloggs"},
  {first: "Albert", last: "Bloggs"},
  {first: "Mary", last: "Albright"}
];
a = a.sort((a, b) => {
  var rv = a.last.localeCompare(b.last);
  if (rv === 0) {
    rv = a.first.localeCompare(b.first);
  }
  return rv;
});
console.log(JSON.stringify(a));

সংস্করণ ছাড়াই অভিব্যক্তি শরীর বা সংক্ষিপ্ত শরীরের{ ... } সাথে একটি তীর ফাংশন বলা হয় । (এছাড়াও: একটি সংক্ষিপ্ত তীর ফাংশন)) শরীরকে সংজ্ঞায়িত করা একটি হ'ল একটি ফাংশন বডি সহ একটি তীর ফাংশন । (এছাড়াও: একটি ভার্বোস তীর ফাংশন।){ ... }

অবজেক্ট ইনিশিয়ালাইজারে পদ্ধতি ঘোষণা (ES2015 +)

ES2015 এমন একটি সম্পত্তি ঘোষণার জন্য একটি সংক্ষিপ্ত রূপকে অনুমতি দেয় যা কোনও পদ্ধতি সংজ্ঞা বলে একটি ফাংশন উল্লেখ করে ; এটি দেখতে এরকম দেখাচ্ছে:

var o = {
    foo() {
    }
};

ES5 এবং এর আগের সমতুল্য হবে:

var o = {
    foo: function foo() {
    }
};

পার্থক্যটি (ভার্বোসিটি ব্যতীত) হ'ল কোনও পদ্ধতি ব্যবহার করতে পারে superতবে একটি ফাংশন পারে না। সুতরাং উদাহরণস্বরূপ, যদি আপনার কাছে এমন কোনও অবজেক্ট থাকে যা valueOfপদ্ধতি সিনট্যাক্স ব্যবহার করে সংজ্ঞায়িত (বলে) দেয় super.valueOf()তবে মানটি Object.prototype.valueOfফিরে আসার জন্য এটি ব্যবহার করতে পারে (সম্ভবত এটির সাথে অন্য কিছু করার আগে), তবে এর Object.prototype.valueOf.call(this)পরিবর্তে ES5 সংস্করণটি করতে হবে।

যে মানে হল যে পদ্ধতি, বস্তুর উপর সংজ্ঞায়িত করা হয় একটি রেফারেন্স রয়েছে তাই যদি যে বস্তুর সাময়িক (উদাহরণস্বরূপ, আপনি তা পার করছি Object.assignউৎস বস্তুর এক হিসাবে), পদ্ধতি সিনট্যাক্স পারে মানে যে বস্তুর বজায় রাখা হয় স্মৃতিতে যখন অন্যথায় এটি আবর্জনা সংগ্রহ করা যেত (জাভাস্ক্রিপ্ট ইঞ্জিন যদি সেই পরিস্থিতিটি সনাক্ত না করে এবং কোনও পদ্ধতি ব্যবহার না করে তবে এটি পরিচালনা করে super)।

class(ES2015 +) এর মধ্যে নির্মাতা এবং পদ্ধতি ঘোষণা

ES2015 আমাদের কাছে classসিনট্যাক্স এনেছে , ঘোষিত কনস্ট্রাক্টর এবং পদ্ধতিগুলি সহ:

class Person {
    constructor(firstName, lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    getFullName() {
        return this.firstName + " " + this.lastName;
    }
}

উপরে দুটি ফাংশন ঘোষণা রয়েছে: একটি কনস্ট্রাক্টরের জন্য, যা নামটি পায় Personএবং একটির জন্য getFullName, যা নির্ধারিত একটি ফাংশন Person.prototype


3
তাহলে নামটি wকি এড়ানো যায়?
বিআইআইবি

8
@ পেলেপেন্না: ফাংশনের নামগুলি প্রচুর কাজের জন্য কার্যকর। আমার দৃষ্টিতে দুটি বড়টি হ'ল পুনরাবৃত্তি এবং ফাংশনটির নাম কল স্ট্যাক, ব্যতিক্রমের চিহ্ন এবং এই জাতীয় ক্ষেত্রে প্রদর্শিত হচ্ছে।
টিজে ক্রোডার

4
@ ছাইম এলিয়াহ - "গ্রহণ করা মানে এই নয় যে এটি সেরা উত্তর, এর অর্থ কেবল এটি যে জিজ্ঞাসা করেছিল তার পক্ষে কাজ করে।" উত্স
স্ক্র্যাপকোড

6
@আর: বেশ সত্য। মজাদারভাবে, যদিও এর ঠিক উপরে এটি বলছে "সেরা উত্তরগুলি প্রথমে প্রদর্শিত হবে যাতে সেগুলি সর্বদা সন্ধান করা সহজ হয়।" যেহেতু গৃহীত উত্তরগুলি উচ্চ-ভোটযুক্ত উত্তরের চেয়েও প্রথমে প্রদর্শিত হয়, তাই এই সফরটি কিছুটা স্ব-বিরোধী হতে পারে। ;-) এছাড়াও কিছুটা ভুল, যদি আমরা ভোটের মাধ্যমে "সেরা" নির্ধারণ করি (যা নির্ভরযোগ্য নয়, এটি আমরা যা পেয়েছি কেবল), "সেরা" উত্তরগুলি কেবল তখনই প্রদর্শিত হবে যদি আপনি "ভোট" ট্যাব ব্যবহার করছেন তবে - অন্যথায়, প্রথমে যে উত্তরগুলি দেওয়া হয় সেগুলি হ'ল সক্রিয় বা সবচেয়ে পুরানো।
টিজে ক্রাউডার

1
@ টিজে ক্রাউডার: একমত 'তারিখ অনুসারে সাজানো' কখনও কখনও বিরক্ত হয়।
স্ক্র্যাপকোড

143

উভয়ই বৈশ্বিক প্রসঙ্গে কথা বলি, varবিবৃতি এবং FunctionDeclarationশেষে একটি বিশ্বব্যাপী অবজেক্টে একটি অ-মুছনযোগ্য সম্পত্তি তৈরি করবে , তবে উভয়ের মানই ওভাররাইট করা যেতে পারে

দুটি পদ্ধতির মধ্যে সূক্ষ্ম পার্থক্য হ'ল যখন চলক ইনস্ট্যান্টেশন প্রক্রিয়া চলবে (প্রকৃত কোড কার্যকর করার আগে) ঘোষিত সমস্ত সনাক্তকারীকে varসূচনা করা হবে undefinedএবং এর দ্বারা FunctionDeclarationব্যবহৃতগুলি সেই মুহুর্ত থেকেই উপলব্ধ থাকবে, উদাহরণস্বরূপ:

 alert(typeof foo); // 'function', it's already available
 alert(typeof bar); // 'undefined'
 function foo () {}
 var bar = function () {};
 alert(typeof bar); // 'function'

bar FunctionExpressionরানটাইম পর্যন্ত অ্যাসাইনমেন্টটি স্থান নেয়।

একটি দ্বারা নির্মিত একটি বিশ্বব্যাপী সম্পত্তি FunctionDeclarationঠিক কোনও ভেরিয়েবল মানের মতো কোনও সমস্যা ছাড়াই ওভাররাইট করা যায়, যেমন:

 function test () {}
 test = null;

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

আপনার সম্পাদিত প্রথম উদাহরণ ( foo = function() { alert('hello!'); };) সম্পর্কে, এটি একটি অঘোষিত অ্যাসাইনমেন্ট, আমি আপনাকে সর্বদা varকীওয়ার্ডটি ব্যবহার করতে উত্সাহিত করব ।

varবিবৃতি ব্যতীত একটি অ্যাসাইনমেন্ট সহ , যদি রেফারেন্সড আইডেন্টিফায়ারটি স্কোপ চেইনে পাওয়া যায় না, তবে এটি বৈশ্বিক অবজেক্টের মুছতে সক্ষম সম্পত্তি হয়ে উঠবে ।

এছাড়াও, অঘোষিত অ্যাসাইনমেন্টগুলি কঠোর মোডেরReferenceError আওতায় ECMAScript 5 এ ফেলে দেয় ।

অবশ্যই পড়তে হবে:

দ্রষ্টব্য : এই উত্তরটি অন্য একটি প্রশ্ন থেকে একীভূত করা হয়েছে , যার মধ্যে ওপি থেকে সবচেয়ে বড় সন্দেহ এবং ভুল ধারণাটি হ'ল একটি দ্বারা চিহ্নিত শনাক্তকারীদের FunctionDeclarationওভাররাইট করা যায় না যা এটি নয়।


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

2
404 নাম্বার হিসাবে "নাম ফাংশন এক্সপ্রেশনগুলি অপ্রচলিত" নিবন্ধটিতে +0 করুন। সম্ভাব্য আয়না ?: kangax.github.com/nfe
Mr_Chimp

@ সিএমএস মনে রাখবেন যদিও আমি কখনই আসলটি দেখিনি তাই আমি জানি না এটি একটি আয়না বা একই শিরোনাম সহ অন্য কোনও নিবন্ধ কিনা!
মিঃ_চিম্প

@ মি_চিম্প আমি নিশ্চিত তা নিশ্চিত, ওয়েওয়েব্যাকমাচিন বলছে যে এটি ক্রল সময়ে 302 পেয়েছিল এবং আপনার সরবরাহিত লিঙ্কটিতে পুনঃনির্দেশটি ছিল।
জন

123

আপনি যে দুটি কোড স্নিপেট পোস্ট করেছেন সেগুলি প্রায় সকল উদ্দেশ্যে একইভাবে আচরণ করবে।

তবে, আচরণের পার্থক্যটি হ'ল প্রথম ভেরিয়েন্ট ( var functionOne = function() {}) এর সাথে, সেই ফাংশনটি কেবল কোডের সেই বিন্দুটির পরে বলা যেতে পারে।

দ্বিতীয় ভেরিয়েন্ট ( function functionTwo()) এর সাথে, ফাংশনটি কোডটিতে পাওয়া যায় যা ফাংশনটি ঘোষিত হয় যেখানে উপরে চলে যায়।

এটি কারণ প্রথম বৈকল্পিকের সাথে, ফাংশনটি fooরান টাইমে ভেরিয়েবলকে বরাদ্দ করা হয় । দ্বিতীয়টিতে, ফাংশনটি শনাক্তকরণকারীকে, fooপার্স সময়ে নির্ধারিত হয় ।

আরও প্রযুক্তিগত তথ্য

জাভাস্ক্রিপ্টের কার্যকারিতা নির্ধারণের তিনটি উপায় রয়েছে।

  1. আপনার প্রথম স্নিপেট একটি ফাংশন এক্সপ্রেশন দেখায় । এর মধ্যে একটি ফাংশন তৈরি করতে "ফাংশন" অপারেটর ব্যবহার করা জড়িত - সেই অপারেটরের ফলাফল কোনও পরিবর্তনশীল বা বস্তুর সম্পত্তিতে সংরক্ষণ করা যেতে পারে। ফাংশন এক্সপ্রেশন যেভাবে শক্তিশালী। ফাংশন এক্সপ্রেশনটিকে প্রায়শই "বেনামে ফাংশন" বলা হয়, কারণ এর কোনও নাম থাকতে হবে না,
  2. আপনার দ্বিতীয় উদাহরণ একটি ফাংশন ঘোষণা । এটি একটি ফাংশন তৈরি করতে "ফাংশন" বিবৃতি ব্যবহার করে । ফাংশনটি বিশদ সময় উপলভ্য করা হয় এবং সেই সুযোগে যে কোনও জায়গায় বলা যেতে পারে। আপনি এটি পরে কোনও ভেরিয়েবল বা বস্তুর সম্পত্তিতে সঞ্চয় করতে পারেন।
  3. কোনও ফাংশন সংজ্ঞায়িত করার তৃতীয় উপায় হ'ল "ফাংশন ()" কনস্ট্রাক্টর , যা আপনার মূল পোস্টে প্রদর্শিত হয় না। এটি যেমন ব্যবহার করে ঠিক তেমনভাবে ব্যবহার করার প্রস্তাব দেওয়া হয় না eval(), যার সমস্যা আছে।

103

গ্রেগের উত্তরের আরও ভাল ব্যাখ্যা

functionTwo();
function functionTwo() {
}

ত্রুটি নেই কেন? আমাদের সর্বদা শেখানো হয়েছিল যে এক্সপ্রেশনগুলি উপর থেকে নীচে (??) পর্যন্ত কার্যকর করা হয়

কারণ:

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

এর অর্থ এই কোডটির মতো:

functionOne();                  ---------------      var functionOne;
                                | is actually |      functionOne();
var functionOne = function(){   | interpreted |-->
};                              |    like     |      functionOne = function(){
                                ---------------      };

লক্ষ্য করুন যে ঘোষণাপত্রগুলির কার্যভার অংশটি উত্তোলন করা হয়নি। শুধুমাত্র নাম উত্তোলন করা হয়।

তবে ফাংশন ঘোষণার ক্ষেত্রে পুরো ফাংশন বডিটিও উত্তোলন করা হবে :

functionTwo();              ---------------      function functionTwo() {
                            | is actually |      };
function functionTwo() {    | interpreted |-->
}                           |    like     |      functionTwo();
                            ---------------

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

91

অন্যান্য মন্তব্যকারীরা ইতিমধ্যে উপরোক্ত দুটি ভেরিয়েন্টের সিন্থেটিক পার্থক্যটি coveredেকে ফেলেছে। আমি একটি শৈলীগত পার্থক্য নোট করতে চেয়েছিলাম: কেবলমাত্র "অ্যাসাইনমেন্ট" প্রকরণটি অন্য কোনও বস্তুর সম্পত্তি সেট করতে পারে।

আমি প্রায়শই এর মতো প্যাটার্ন সহ জাভাস্ক্রিপ্ট মডিউলগুলি তৈরি করি:

(function(){
    var exports = {};

    function privateUtil() {
            ...
    }

    exports.publicUtil = function() {
            ...
    };

    return exports;
})();

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

(এও নোট করুন যে বিবৃতি দেওয়ার পরে অ্যাসাইনমেন্টের জন্য একটি সেমিকোলন হওয়া উচিত, যখন ঘোষণাপত্রটি এটি নিষিদ্ধ করে))


4
yuiblog.com/blog/2007/06/12/module-pattern মডিউল প্যাটার্নের জন্য প্রাথমিক তথ্যসূত্র, যতদূর আমি বলতে পারি। (যদিও নিবন্ধ ব্যবহার করে var foo = function(){...}বাক্য গঠন এমনকি ব্যক্তিগত ভেরিয়েবল জন্য।
শন ম্যাকমিলান

এটি আসলে কিছু পুরানো সংস্করণে সম্পূর্ণ সত্য নয়। ( function window.onload() {}একটা জিনিস ছিল।)
Ry-

77

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

সঙ্গে

if (condition){
    function myfunction(){
        // Some code
    }
}

, এই সংজ্ঞাটি myfunctionপূর্ববর্তী কোনও সংজ্ঞা ওভাররাইড করবে, যেহেতু এটি পার্স-টাইমে করা হবে।

যদিও

if (condition){
    var myfunction = function (){
        // Some code
    }
}

myfunctionযখন conditionদেখা হয় তখনই সংজ্ঞা দেওয়ার সঠিক কাজটি করে ।


1
এই উদাহরণটি ভাল এবং পরিপূর্ণতার নিকটে, তবে উন্নত হতে পারে। আরও ভাল উদাহরণটি var myFunc = null;লুপের বাইরে বা একটি / ifif / অন্য ব্লকের বাইরে সংজ্ঞায়িত করা হবে । তারপরে আপনি শর্তসাপেক্ষে একই ভেরিয়েবলে বিভিন্ন ফাংশন বরাদ্দ করতে পারেন। জেএসে, এটি একটি অনুপস্থিত মান শূন্য করা, তারপরে অপরিজ্ঞিত করার জন্য এটি একটি আরও ভাল কনভেনশন। অতএব, আপনার প্রথমে আমার ফাংশনটি নাল হিসাবে ঘোষণা করা উচিত, তারপরে এটি শর্তসাপেক্ষে পরে নির্ধারণ করুন।
আলেকজান্ডার মিলস

62

একটি গুরুত্বপূর্ণ কারণ হ'ল আপনার নেমস্পেসের "রুট" হিসাবে একটি এবং কেবল একটি ভেরিয়েবল যুক্ত করা ...

var MyNamespace = {}
MyNamespace.foo= function() {

}

অথবা

var MyNamespace = {
  foo: function() {
  },
  ...
}

নেমস্পেসিংয়ের জন্য অনেক কৌশল রয়েছে। এটি জাভাস্ক্রিপ্ট মডিউল উপলব্ধ আধিক্যের সাথে আরও গুরুত্বপূর্ণ হয়ে ওঠে।

এছাড়াও আমি কীভাবে জাভাস্ক্রিপ্টে একটি নেমস্পেস ঘোষণা করব?


3
দেখে মনে হচ্ছে এই উত্তর আরেকটি প্রশ্ন থেকে এই প্রশ্নের মধ্যে মিশে গিয়ে তৈরি হয়, এবং বাক্যে কথন পারে একটি ক্ষুদ্র বিট সম্পর্কহীন হবে বলে মনে হচ্ছে এই প্রশ্ন। আপনি কি উত্তরটি সম্পাদনা বিবেচনা করবেন তাই এটি এই প্রশ্নে বিশেষভাবে আরও নির্দেশিত বলে মনে হচ্ছে? (পুনরাবৃত্তি করতে; এটি মোটেও আপনার দোষ নয় ... মার্জ হওয়া প্রশ্নের কেবলমাত্র পার্শ্ব-প্রতিক্রিয়া)। আপনি এটি মুছতেও পারেন এবং আমি মনে করি আপনি নিজের খ্যাতি বজায় রাখবেন। বা আপনি এটি ছেড়ে যেতে পারেন; যেহেতু এটি পুরানো, এটি কোনও বড় পার্থক্য নাও করতে পারে।
অ্যান্ড্রু বারবার

55

হোস্টিং হ'ল জাভাস্ক্রিপ্ট ইন্টারপ্রেটারের সমস্ত পরিবর্তনশীল এবং ফাংশন ঘোষণাকে বর্তমান স্কোপের শীর্ষে স্থানান্তরিত করার কাজ।

তবে, কেবল আসল ঘোষণাগুলি উত্তোলন করা হয়। তারা যেখানে রয়েছে অ্যাসাইনমেন্ট রেখে

  • পৃষ্ঠার ভিতরে ঘোষিত ভেরিয়েবল / ফাংশনগুলি বিশ্বব্যাপী সেই পৃষ্ঠার যে কোনও জায়গায় অ্যাক্সেস করতে পারে।
  • ফাংশনের অভ্যন্তরে ঘোষিত ভেরিয়েবল / ফাংশনগুলির স্থানীয় সুযোগ রয়েছে। এর অর্থ তারা ফাংশন বডি (স্কোপ) এর ভিতরে উপলব্ধ / অ্যাক্সেসযোগ্য, তারা ফাংশন বডির বাইরে উপলভ্য নয়।

পরিবর্তনশীল

জাভাস্ক্রিপ্টকে আলগাভাবে টাইপ করা ভাষা বলা হয়। যার অর্থ জাভাস্ক্রিপ্ট ভেরিয়েবলগুলি কোনও ডেটা-টাইপের মান রাখতে পারে । জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে রানটাইমের সময় প্রদত্ত মান / আক্ষরিক উপর ভিত্তি করে ভেরিয়েবল-প্রকার পরিবর্তন করার যত্ন নেয় care

global_Page = 10;                                               var global_Page;      « undefined
    « Integer literal, Number Type.   -------------------       global_Page = 10;     « Number         
global_Page = 'Yash';                 |   Interpreted   |       global_Page = 'Yash'; « String
    « String literal, String Type.    «       AS        «       global_Page = true;   « Boolean 
var global_Page = true;               |                 |       global_Page = function (){          « function
    « Boolean Type                    -------------------                 var local_functionblock;  « undefined
global_Page = function (){                                                local_functionblock = 777 Number
    var local_functionblock = 777;                              };  
    // Assigning function as a data.
};  

ক্রিয়া

function Identifier_opt ( FormalParameterList_opt ) { 
      FunctionBody | sequence of statements

      « return;  Default undefined
      « return 'some data';
}
  • পৃষ্ঠার অভ্যন্তরে ঘোষিত ফাংশনগুলি বিশ্বব্যাপী অ্যাক্সেসযুক্ত পৃষ্ঠার শীর্ষে উত্তোলন করা হয়।
  • ফাংশন-ব্লকের ভিতরে ঘোষিত ফাংশনগুলি ব্লকের শীর্ষে উত্তোলন করা হয়।
  • ফাংশনের ডিফল্ট রিটার্ন মান হ'ল ' অপরিজ্ঞাত ', চলক ঘোষণার ডিফল্ট মানও 'অপরিজ্ঞাত'

    Scope with respect to function-block global. 
    Scope with respect to page undefined | not available.

কার্য ঘোষণা

function globalAccess() {                                  function globalAccess() {      
}                                  -------------------     }
globalAccess();                    |                 |     function globalAccess() { « Re-Defined / overridden.
localAccess();                     «   Hoisted  As   «         function localAccess() {
function globalAccess() {          |                 |         }
     localAccess();                -------------------         localAccess(); « function accessed with in globalAccess() only.
     function localAccess() {                              }
     }                                                     globalAccess();
}                                                          localAccess(); « ReferenceError as the function is not defined

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

        10;                 « literal
       (10);                « Expression                (10).toString() -> '10'
var a;                      
    a = 10;                 « Expression var              a.toString()  -> '10'
(function invoke() {        « Expression Function
 console.log('Self Invoking');                      (function () {
});                                                               }) () -> 'Self Invoking'

var f; 
    f = function (){        « Expression var Function
    console.log('var Function');                                   f ()  -> 'var Function'
    };

ভেরিয়েবলের জন্য কার্য সম্পাদন করা উদাহরণ:

(function selfExecuting(){
    console.log('IIFE - Immediately-Invoked Function Expression');
}());

var anonymous = function (){
    console.log('anonymous function Expression');
};

var namedExpression = function for_InternalUSE(fact){
    if(fact === 1){
        return 1;
    }

    var localExpression = function(){
        console.log('Local to the parent Function Scope');
    };
    globalExpression = function(){ 
        console.log('creates a new global variable, then assigned this function.');
    };

    //return; //undefined.
    return fact * for_InternalUSE( fact - 1);   
};

namedExpression();
globalExpression();

জাভাস্ক্রিপ্ট হিসাবে ব্যাখ্যা করা

var anonymous;
var namedExpression;
var globalExpression;

anonymous = function (){
    console.log('anonymous function Expression');
};

namedExpression = function for_InternalUSE(fact){
    var localExpression;

    if(fact === 1){
        return 1;
    }
    localExpression = function(){
        console.log('Local to the parent Function Scope');
    };
    globalExpression = function(){ 
        console.log('creates a new global variable, then assigned this function.');
    };

    return fact * for_InternalUSE( fact - 1);    // DEFAULT UNDEFINED.
};

namedExpression(10);
globalExpression();

আপনি বিভিন্ন ব্রাউজারের ব্যবহারের মাধ্যমে ফাংশন ঘোষণা, অভিব্যক্তি পরীক্ষা পরীক্ষা করতে পারেন jsperf Test Runner


ES5 কনস্ট্রাক্টর ফাংশন ক্লাস : ফাংশন.প্রোটোটাইপ.বাইন্ড ব্যবহার করে ফাংশন অবজেক্ট তৈরি করা হয়েছে

জাভাস্ক্রিপ্ট ফাংশনটিকে প্রথম শ্রেণীর অবজেক্ট হিসাবে বিবেচনা করে, তাই কোনও বস্তু হওয়ায় আপনি কোনও ফাংশনে বৈশিষ্ট্য বরাদ্দ করতে পারেন।

function Shape(id) { // Function Declaration
    this.id = id;
};
    // Adding a prototyped method to a function.
    Shape.prototype.getID = function () {
        return this.id;
    };
    Shape.prototype.setID = function ( id ) {
        this.id = id;
    };

var expFn = Shape; // Function Expression

var funObj = new Shape( ); // Function Object
funObj.hasOwnProperty('prototype'); // false
funObj.setID( 10 );
console.log( funObj.getID() ); // 10

ES6 তীর ফাংশন প্রবর্তন : একটি তীর ফাংশন এক্সপ্রেশন একটি সংক্ষিপ্ত বাক্য গঠন আছে, তারা নন-পদ্ধতি ফাংশনের জন্য সেরা উপযুক্ত, এবং সেগুলি নির্মাণকারী হিসাবে ব্যবহার করা যায় না।

ArrowFunction : ArrowParameters => ConciseBody

const fn = (item) => { return item & 1 ? 'Odd' : 'Even'; };
console.log( fn(2) ); // Even
console.log( fn(3) ); // Odd

3
আহ, তোমার উত্তর ... এটা কি অস্পষ্ট নয়? বেশি তথ্য ব্যয় করার জন্য এবং লেখার জন্য এত ভাল +1 লিখেছেন।
ডেনিশ

40

আমি আমার নিজের উত্তরটি যুক্ত করছি কারণ প্রত্যেকে প্রত্যাহারের অংশটি পুরোপুরি hasেকে রেখেছে।

আমি কীভাবে এখন দীর্ঘ সময়ের জন্য আরও ভাল সে সম্পর্কে ভেবে অবাক হয়েছি, এবং এখনই http://jsperf.com কে ধন্যবাদ জানলাম :)

এখানে চিত্র বর্ণনা লিখুন

ফাংশন ঘোষণাগুলি দ্রুততর হয় এবং এটিই ওয়েব ডেভয়ে সত্যই গুরুত্বপূর্ণ? ;)


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

3
ঠিক আছে, আমি এটি ফায়ারফক্সের সাথে অন্যভাবে খুঁজে পেয়েছি। jsperf.com/sandytest
সন্দীপ নায়ক

কেবলমাত্র একটি আপডেট, যেহেতু আমি এখন জাভাস্ক্রিপ্টে সম্পূর্ণ কার্যকরী প্রোগ্রামিং শৈলীতে চলে এসেছি, আমি কখনই ঘোষণাগুলি ব্যবহার করি না, কেবলমাত্র ফাংশন এক্সপ্রেশন করি যাতে আমি তাদের ভেরিয়েবল নামগুলি দ্বারা আমার ফাংশনগুলিকে শৃঙ্খলিত করতে এবং কল করতে পারি। রামদাজেএস দেখুন ...
লিওন গাবান

1
@ সন্দীপনায়েক আমি ফায়ারফক্স ৫০.০.০ / উইন্ডোজ 0.0 ০.০.০ এ আপনার নিজস্ব পরীক্ষা চালিয়েছি এবং এটি আসলে লিওনের মতোই। সুতরাং যদি আপনার পরীক্ষাটি সঠিক হয় তবে আমি উপসংহারে পৌঁছে যাব যে jsperf এর পরীক্ষাগুলি সূচক নয়, এবং এটি সমস্ত আপনার ব্রাউজার এবং / অথবা OS সংস্করণে বা সেই নির্দিষ্ট মুহুর্তে বর্তমান মেশিনের নির্দিষ্ট অবস্থার উপর নির্ভর করে।
অক্টোবরে

33

একটি ভেরিয়েবলের জন্য বরাদ্দ করা একটি ফাংশন ঘোষণা এবং একটি ফাংশন এক্সপ্রেশন বন্ধনটি প্রতিষ্ঠিত হওয়ার পরে একই আচরণ করে।

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

মূলত, সমস্ত ফাংশন ঘোষণা এবং পরিবর্তনশীল ঘোষণা ফাংশনটির শীর্ষে উত্তোলন করা হয় যেখানে ঘোষণাপত্রটি ঘটে (এটি কারণ আমরা বলি যে জাভাস্ক্রিপ্টের কার্যকারিতা রয়েছে )।

  • যখন কোনও ফাংশন ঘোষণাটি উত্তোলন করা হয়, তখন ফাংশন বডিটি "অনুসরণ করে" সুতরাং যখন ফাংশন বডিটি মূল্যায়ন করা হয়, তত্ক্ষণাত্ ভেরিয়েবলটি কোনও ফাংশন অবজেক্টের সাথে আবদ্ধ হয়ে যায়।

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

উত্তোলনের ক্রমটিও গুরুত্বপূর্ণ: ফাংশন ঘোষণাগুলি একই নামের সাথে পরিবর্তনশীল ঘোষণার চেয়ে অগ্রাধিকার গ্রহণ করে এবং শেষ ফাংশন ঘোষণাপত্র একই নামের সাথে পূর্ববর্তী ফাংশন ঘোষণার চেয়ে অগ্রাধিকার গ্রহণ করে।

কিছু উদাহরণ...

var foo = 1;
function bar() {
  if (!foo) {
    var foo = 10 }
  return foo; }
bar() // 10

চলক fooফাংশন, সক্রিয়া শীর্ষে উত্তোলন করা হয় undefinedযাতে, !fooহয় true, তাই fooনির্ধারিত হয় 10fooবাইরে barএর সুযোগ কোন ভূমিকা পালন করে এবং অস্পৃষ্ট হয়।

function f() {
  return a; 
  function a() {return 1}; 
  var a = 4;
  function a() {return 2}}
f()() // 2

function f() {
  return a;
  var a = 4;
  function a() {return 1};
  function a() {return 2}}
f()() // 2

ফাংশন ঘোষণাগুলি ভেরিয়েবলের ঘোষণাপত্রের তুলনায় এবং সর্বশেষ ফাংশন ঘোষণাকে "লাঠি" বলে অগ্রাধিকার দেয়।

function f() {
  var a = 4;
  function a() {return 1}; 
  function a() {return 2}; 
  return a; }
f() // 4

এই উদাহরণে aদ্বিতীয় ফাংশন ঘোষণার মূল্যায়ন করার ফলে ফাংশন অবজেক্টের সাথে আরম্ভ করা হয় এবং তারপরে নির্ধারিত হয় 4

var a = 1;
function b() {
  a = 10;
  return;
  function a() {}}
b();
a // 1

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


3
বন্ধ বন্ধনীগুলি রাখার জন্য আপনার কাছে কিছুটা অদ্ভুত উপায় রয়েছে। আপনি কি পাইথন কোডার? দেখে মনে হচ্ছে আপনি জাভাস্ক্রিপ্টটিকে পাইথনের মতো দেখানোর চেষ্টা করেছেন। আমি আশঙ্কা করি এটি অন্যান্য লোকের জন্য বিভ্রান্তিকর। যদি আমি আপনার জাভাস্ক্রিপ্ট কোডটি বজায় রাখতে পারি তবে আমি প্রথমে আপনার কোডটি একটি স্বয়ংক্রিয় প্রশংসাপত্রের মাধ্যমে দিয়ে দেব।
n:4ly

1
দুর্দান্ত পোস্ট। একটি 'স্ব-সম্পাদনকারী ফাংশন' বা 'তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন' দেখতে যথেষ্ট সহজ হওয়া উচিত এবং তার স্টাইলের পছন্দটি তার পোস্ট থেকে বিরত থাকা উচিত নয় - যা সঠিক এবং 'উত্তোলন' পুরোপুরি সংক্ষিপ্তসার করে। +1
রিক্সালিন

32

প্রথম উদাহরণ একটি ফাংশন ঘোষণা:

function abc(){}

দ্বিতীয় উদাহরণটি একটি ফাংশন এক্সপ্রেশন:

var abc = function() {};

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

এটি সহজভাবে বলতে:

//this will work
abc(param);
function abc(){}

//this would fail
abc(param);
var abc = function() {}

এই বিষয় সম্পর্কে আরও অধ্যয়নের জন্য আমি আপনাকে এই লিঙ্কটি দৃ strongly়ভাবে প্রস্তাব দিচ্ছি


1
আপনার উদাহরণটি শীর্ষ জবাবের মতো একই রকম
GôTô

এই উত্তরটি পোস্ট করার মূল কারণটি ছিল নীচে লিঙ্কটি সরবরাহ করা। উপরের প্রশ্নটি পুরোপুরি বুঝতে এটি আমার জন্য অনুপস্থিত ছিল।
sla55er

1
আপনি লিংকটি ভাগ করে নিতে চেয়েছিলেন এটি খুব দুর্দান্ত। তবে অতিরিক্ত তথ্যের লিঙ্কগুলি, এসও তে, কেবলমাত্র প্রশ্ন বা আপনার পছন্দসই উত্তর সম্পর্কে একটি মন্তব্য হওয়া উচিত। এটির শেষে একটি একক দরকারী লিঙ্ক যুক্ত করার জন্য বারবার তথ্যের সাথে একটি দীর্ঘ, জটিল পৃষ্ঠাটি ঝাপটানো খুব উপ-অনুকূল। না, আপনি লিঙ্কটি সরবরাহ করার জন্য কোনও রেপ পয়েন্ট পাবেন না, তবে আপনি সম্প্রদায়টিকে সহায়তা করবেন।
এক্সএমএল

30

কোড রক্ষণাবেক্ষণ ব্যয়ের ক্ষেত্রে, নামযুক্ত ফাংশনগুলি আরও বেশি পছন্দনীয়:

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

আমি সন্দেহ করি যে নামযুক্ত ফাংশনগুলির জন্য আরও জনসংযোগগুলি অনুসরণ করা হয়। এবং নামযুক্ত ফাংশনগুলির সুবিধার হিসাবে যা তালিকাভুক্ত করা হয়েছে তা অনামী ব্যক্তিদের জন্য অসুবিধা।

Orতিহাসিকভাবে, বেনাম ফাংশনগুলি জাভাস্ক্রিপ্টের অক্ষমতা থেকে নাম হিসাবে চিহ্নিত ফাংশন সহ সদস্যদের তালিকা করতে একটি ভাষা হিসাবে উপস্থিত হয়েছিল:

{
    member:function() { /* How do I make "this.member" a named function? */
    }
}

2
নিশ্চিত করার জন্য পরীক্ষা রয়েছে: blog.firsov.net/2010/01/… জেএস পারফরম্যান্স পরীক্ষা - স্কোপ এবং নামযুক্ত ফাংশন - অ্যানালিটিক্স
সাশা ফিরসভ

25

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

বেনামে ফাংশন এবং ল্যাম্বডা ক্যালকুলাস সম্পর্কে আরও তথ্যের জন্য, উইকিপিডিয়া একটি ভাল শুরু ( http://en.wikedia.org/wiki/Anonymous_function )।


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

25

আমি আমার কোডে পরিবর্তনশীল পদ্ধতির খুব নির্দিষ্ট কারণে ব্যবহার করি, যার তত্ত্বটি উপরে একটি বিমূর্ত পদ্ধতিতে আচ্ছাদিত করা হয়েছিল তবে জাভা স্ক্রিপ্টের সীমিত দক্ষতার সাথে উদাহরণটি আমার মতো কিছু লোককে সহায়তা করতে পারে।

আমার কোড রয়েছে যা আমার 160 টি স্বতঃ-ডিজাইন করা ব্র্যান্ডিংয়ের সাথে চালানো দরকার। বেশিরভাগ কোড ভাগ করা ফাইলগুলিতে থাকে তবে ব্র্যান্ডিং-নির্দিষ্ট স্টাফ পৃথক ফাইলে থাকে, প্রতিটি ব্র্যান্ডিংয়ের জন্য একটি।

কিছু ব্র্যান্ডিংয়ের নির্দিষ্ট ফাংশন প্রয়োজন, এবং কিছু নাও লাগে। কখনও কখনও নতুন ব্র্যান্ডিং-নির্দিষ্ট জিনিসগুলি করতে আমাকে নতুন ফাংশন যুক্ত করতে হয়। আমি ভাগ করা কোডডটি পরিবর্তন করে খুশি, তবে আমি ব্র্যান্ডিং ফাইলের সমস্ত 160 সেট পরিবর্তন করতে চাই না।

ভেরিয়েবল সিনট্যাক্স ব্যবহার করে, আমি ভাগ করা কোডে ভেরিয়েবল (মূলত একটি ফাংশন পয়েন্টার) ঘোষণা করতে পারি এবং হয় তুচ্ছ স্টাব ফাংশন বরাদ্দ করতে পারি, বা বাতিল করতে সেট করতে পারি।

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

উপরের লোকের মন্তব্যগুলি থেকে, আমি সংগ্রহ করি এটি একটি স্থির ফাংশনটিকেও নতুনভাবে সংজ্ঞায়িত করা সম্ভব হতে পারে তবে আমি ভেরিয়েবল সমাধানটি সুন্দর এবং পরিষ্কার বলে মনে করি।


25

গ্রেগের উত্তর যথেষ্ট ভাল, তবে আমি এখনও এটিতে এমন কিছু যুক্ত করতে চাই যা আমি এখনই ডগলাস ক্রকফোর্ডের ভিডিওগুলি দেখে শিখেছি ।

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

var foo = function foo() {};

ফাংশন বিবৃতি:

function foo() {};

ফাংশন স্টেটমেন্টটি varএকটি functionমান সহ বিবৃতি দেওয়ার জন্য কেবল একটি সংক্ষিপ্ত হাত hand

সুতরাং

function foo() {};

প্রসারিত হয়

var foo = function foo() {};

যা আরও প্রসারিত:

var foo = undefined;
foo = function foo() {};

এবং তারা উভয়ই কোড শীর্ষে উত্তোলন করা হয়।

ভিডিও থেকে স্ক্রিনশট


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

এই কোড উদাহরণগুলি একবার দেখুন: gist.github.com/cyberthom/36603fbc20de8e04fd09
টমাস হেইম্যান

23

নীচে তালিকাভুক্ত ফাংশনগুলির দুটি পৃথক ঘোষণার মধ্যে উল্লেখযোগ্য চারটি তুলনা রয়েছে।

  1. ফাংশনের উপলভ্যতা (সুযোগ)

নীচের কাজগুলিতে function add()নিকটস্থ ব্লকে স্কোপ করা রয়েছে:

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

function add(a, b){
  return a + b;
}

নিম্নলিখিতটি কাজ করে না কারণ ভেরিয়েবলের জন্য একটি ফাংশন মান নির্ধারিত হওয়ার আগে ভেরিয়েবলটি ডাকা হয় add

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

var add=function(a, b){
  return a + b;
}

উপরের কোডটি নীচের কোডের সাথে কার্যকারিতায় অভিন্ন। নোট করুন যে স্পষ্টভাবে বরাদ্দ add = undefinedকরা অতিরিক্ত অতিরিক্ত কারণ কারণ কেবল করা var add;ঠিক যেমনটি ঠিক তেমনি var add=undefined

var add = undefined;

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

add = function(a, b){
  return a + b;
}

নিম্নলিখিতগুলি কাজ করে না কারণ var add=সুপারসিডসগুলি function add()

try {
  console.log("Success: ", add(1, 1));
} catch(e) {
  console.log("ERROR: " + e);
}

var add=function add(a, b){
  return a + b;
}

  1. (ফাংশন) .নাম

একটি ফাংশন নাম function thefuncname(){}হয় thefuncname যখন এই ভাবে ঘোষিত হয়।

function foobar(a, b){}

console.log(foobar.name);

var a = function foobar(){};

console.log(a.name);

অন্যথায়, যদি কোনও ফাংশন হিসাবে ঘোষণা করা হয় function(){}তবে ফাংশন .নামটি ফাংশনটি সংরক্ষণের জন্য ব্যবহৃত প্রথম পরিবর্তনশীল।

var a = function(){};
var b = (function(){ return function(){} });

console.log(a.name);
console.log(b.name);

যদি ফাংশনে কোনও ভেরিয়েবল সেট না করা থাকে তবে ফাংশনগুলির নাম হ'ল খালি স্ট্রিং ( "")।

console.log((function(){}).name === "");

শেষ অবধি, চলকটি প্রথমে নাম নির্ধারণ করার জন্য নির্ধারিত হয়, ক্রিয়াকলাপে নির্ধারিত পরিবর্তনশীল নাম পরিবর্তন করে না।

var a = function(){};
var b = a;
var c = b;

console.log(a.name);
console.log(b.name);
console.log(c.name);

  1. কর্মক্ষমতা

গুগলের ভি 8 এবং ফায়ারফক্সের স্পাইডারমনকিতে কয়েকটি মাইক্রোসেকেন্ড জেআইএসটি সংকলন পার্থক্য থাকতে পারে তবে শেষ পর্যন্ত ফলাফলটি হুবহু একই। এটি প্রমাণ করার জন্য, দুটি ফাঁকা কোড স্নিপেটের গতির তুলনা করে মাইক্রোবাইনমার্কগুলিতে জেএসপিফারফের দক্ষতা যাচাই করা যাক। JSPerf পরীক্ষার এখানে পাওয়া যায় । এবং, jsben.ch টেস্টের এখানে পাওয়া যায় । যেমন আপনি দেখতে পাচ্ছেন, যখন একটিও না থাকা উচিত তখন একটি উল্লেখযোগ্য পার্থক্য রয়েছে। আপনি যদি সত্যই আমার মতো পারফরম্যান্স ফ্রিক হন তবে স্কোপটিতে ভেরিয়েবল এবং ফাংশনগুলির সংখ্যা হ্রাস করার চেষ্টা এবং বিশেষত পলিমারফিজম (যেমন দুটি ভিন্ন ধরণের সংরক্ষণের জন্য একই ভেরিয়েবল ব্যবহার করে) মুছে ফেলার চেষ্টা করার সময় এটি আপনার পক্ষে আরও মূল্যবান হতে পারে।

  1. পরিবর্তনশীল পরিবর্তনশীলতা

আপনি যখন varভেরিয়েবল ঘোষণার জন্য কীওয়ার্ডটি ব্যবহার করেন , আপনি তার পরে ভেরিয়েবলের জন্য আলাদা মানটি পুনরায় সাইন করতে পারেন।

(function(){
    "use strict";
    var foobar = function(){}; // initial value
    try {
        foobar = "Hello World!"; // new value
        console.log("[no error]");
    } catch(error) {
        console.log("ERROR: " + error.message);
    }
    console.log(foobar, window.foobar);
})();

যাইহোক, আমরা যখন কনস্টেট-স্টেটমেন্ট ব্যবহার করি তখন ভেরিয়েবলের রেফারেন্স পরিবর্তনযোগ্য হয়ে যায়। এর অর্থ হ'ল আমরা ভেরিয়েবলকে নতুন মান নির্ধারণ করতে পারি না। তবে দয়া করে মনে রাখবেন যে এটি ভেরিয়েবলের বিষয়বস্তুকে পরিবর্তনযোগ্য করে তুলবে না: যদি আপনি তা করেন const arr = []তবে আপনি এখনও করতে পারেন arr[10] = "example"। কেবল নীচের মত কিছু করা arr = "new value"বা arr = []ত্রুটি নিক্ষেপ করা হবে।

(function(){
    "use strict";
    const foobar = function(){}; // initial value
    try {
        foobar = "Hello World!"; // new value
        console.log("[no error]");
    } catch(error) {
        console.log("ERROR: " + error.message);
    }
    console.log(foobar, window.foobar);
})();

মজার ব্যাপার হচ্ছে, যদি আমরা পরিবর্তনশীল হিসাবে ঘোষণা function funcName(){}, তারপর ভেরিয়েবলের অপরিবর্তনীয়তা সঙ্গে এটি প্রকাশক হিসাবে একই var

(function(){
    "use strict";
    function foobar(){}; // initial value
    try {
        foobar = "Hello World!"; // new value
        console.log("[no error]");
    } catch(error) {
        console.log("ERROR: " + error.message);
    }
    console.log(foobar, window.foobar);
})();

"নিকটতম ব্লক" কি

"নিকটতম ব্লক" হ'ল নিকটতম "ফাংশন," (অ্যাসিনক্রোনাস ফাংশন, জেনারেটর ফাংশন এবং অ্যাসিনক্রোনাস জেনারেটরের ফাংশন সহ)। যাইহোক, মজার বিষয় হল, বাইরের আইটেমগুলিতে একটি ক্লোজার অ-ক্লোজারে বন্ধ হওয়ার সময় function functionName() {}এমন আচরণ করা হয় var functionName = function() {}। কর।

  • সাধারণ var add=function(){}

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}');
  }
} catch(e) {
  console.log("Is a block");
}
var add=function(a, b){return a + b}

  • সাধারণ function add(){}

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
function add(a, b){
  return a + b;
}

  • ক্রিয়া

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
(function () {
    function add(a, b){
      return a + b;
    }
})();

  • বিবৃতি (যেমন if, else, for, while, try/ catch/ finally, switch, do/ while, with)

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
{
    function add(a, b){
      return a + b;
    }
}

  • সঙ্গে তীর ফাংশন var add=function()

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
(() => {
    var add=function(a, b){
      return a + b;
    }
})();

  • সঙ্গে তীর ফাংশন function add()

try {
  // typeof will simply return "undefined" if the variable does not exist
  if (typeof add !== "undefined") {
    add(1, 1); // just to prove it
    console.log("Not a block");
  }else if(add===undefined){ // this throws an exception if add doesn't exist
    console.log('Behaves like var add=function(a,b){return a+b}')
  }
} catch(e) {
  console.log("Is a block");
}
(() => {
    function add(a, b){
      return a + b;
    }
})();


এটি গ্রহণযোগ্য এবং সর্বাধিক উত্সাহিত উত্তর হওয়ার যোগ্য
অ্যারোন জন সাবু

18

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

টিউটোরিয়াল থেকে উদাহরণ: পুনরাবৃত্তি কল এতে yell():

মূল নিনজা অবজেক্টটি সরিয়ে ফেলা হলে পরীক্ষাগুলি ব্যর্থ হয়। (পৃষ্ঠা 13)

var ninja = { 
  yell: function(n){ 
    return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
  } 
}; 
assert( ninja.yell(4) == "hiyaaaa", "A single object isn't too bad, either." ); 

var samurai = { yell: ninja.yell }; 
var ninja = null; 

try { 
  samurai.yell(4); 
} catch(e){ 
  assert( false, "Uh, this isn't good! Where'd ninja.yell go?" ); 
}

আপনি যদি ফাংশনটির নাম দেন যা পুনরাবৃত্তভাবে বলা হবে, পরীক্ষাগুলি পাস হয়ে যাবে। (পৃষ্ঠা 14)

var ninja = { 
  yell: function yell(n){ 
    return n > 0 ? yell(n-1) + "a" : "hiy"; 
  } 
}; 
assert( ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!" ); 

var samurai = { yell: ninja.yell }; 
var ninja = {}; 
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );

17

অন্যান্য উত্তরে উল্লেখ করা হয়নি এমন আরও একটি পার্থক্য হ'ল আপনি যদি বেনামে ফাংশনটি ব্যবহার করেন

var functionOne = function() {
    // Some code
};

এবং এটি নির্মাণ হিসাবে হিসাবে হিসাবে ব্যবহার করুন

var one = new functionOne();

তাহলে one.constructor.nameসংজ্ঞায়িত করা হবে না। Function.nameমানসম্মত নয় তবে ফায়ারফক্স, ক্রোম, অন্যান্য ওয়েবকিট উদ্ভূত ব্রাউজার এবং আই 9+ এর দ্বারা সমর্থিত।

সঙ্গে

function functionTwo() {
    // Some code
}
two = new functionTwo();

স্ট্রিং সহ কনস্ট্রাক্টরের নাম পুনরুদ্ধার করা সম্ভব two.constructor.name


প্রথম ক্ষেত্রে নামটি সংজ্ঞায়িত করা হবে না কারণ এটি একটি ভেরিয়েবলের জন্য নির্ধারিত একটি অনামী কাজ function আমি মনে করি বেনাম শব্দটি এমন কিছুর জন্য উদ্ভাবিত হয়েছিল যার নাম সংজ্ঞায়িত হয় না :)
ওম শঙ্কর

এই উদাহরণে দুটি = নতুন একটি বিশ্বব্যাপী ফাংশনে পরিণত হয় কারণ কোনও ভার নেই
ওয়াকাস তাহির

16

প্রথমটি (ফাংশন ডোসোমিংথিং (এক্স)) একটি অবজেক্ট নোটেশনের অংশ হওয়া উচিত।

দ্বিতীয়টি ( var doSomething = function(x){ alert(x);}) কেবল একটি বেনামে ফাংশন তৈরি করে এবং এটি একটি ভেরিয়েবলকে অর্পণ করে,doSomething ,। সুতরাং doSomething () ফাংশন কল করবে।

কোনও ফাংশন ঘোষণা এবং ফাংশন এক্সপ্রেশন কী তা আপনি জানতে চাইতে পারেন ।

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

function foo() {
    return 3;
}

ইসিএমএ 5 (13.0) সিনট্যাক্সটি
ফাংশন আইডেন্টিফায়ার (ফর্মালপ্যারামিটারলিস্ট অপ্ট ) হিসাবে বর্ণনা করে { ফাংশনবিডি }

উপরের শর্তে ফাংশনটির নামটি তার স্কোপ এবং এর পিতামাতার স্কোপের মধ্যে দৃশ্যমান (অন্যথায় এটি অ্যাক্সেসযোগ্য হবে)।

এবং একটি ফাংশন প্রকাশে

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

// Anonymous function expression
var a = function() {
    return 3;
}

// Named function expression
var a = function foo() {
    return 3;
}

// Self-invoking function expression
(function foo() {
    alert("hello!");
})();

ইসিএমএ 5 (13.0) সিনট্যাক্সটি
ফাংশন আইডেন্টিফায়ার অপ্ট (ফরমালপ্যারামিটারলিস্ট অপ্ট ) হিসাবে বর্ণনা করে { ফাংশনবিডি }


16

আমি নীচের পার্থক্যগুলি তালিকাবদ্ধ করছি:

  1. কোনও ফাংশন ঘোষণা কোডের যে কোনও জায়গায় রাখা যেতে পারে। কোডটিতে সংজ্ঞাটি উপস্থিত হওয়ার আগে যদি এটি আহ্বান করা হয়, তবে পৃষ্ঠাতে অন্য কোনও কোড কার্যকর করা শুরু হওয়ার আগে, ফাংশন ডিক্লেয়ারেশন মেমরির প্রতি প্রতিশ্রুতিবদ্ধ বা কোনওভাবে এটি উত্তোলন করার কারণে এটি কার্যকর করা হয়।

    নীচের ফাংশনটি একবার দেখুন:

    function outerFunction() {
        function foo() {
           return 1;
        }
        return foo();
        function foo() {
           return 2;
        }
    }
    alert(outerFunction()); // Displays 2

    এর কারণ, মৃত্যুদন্ড কার্যকর করার সময়, এটি দেখতে এমন দেখাচ্ছে:

    function foo() {  // The first function declaration is moved to top
        return 1;
    }
    function foo() {  // The second function declaration is moved to top
        return 2;
    }
    function outerFunction() {
        return foo();
    }
    alert(outerFunction()); //So executing from top to bottom,
                            //the last foo() returns 2 which gets displayed

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

    ফাংশন এক্সপ্রেশন ব্যবহার করে একই ফাংশন:

    function outerFunction() {
        var foo = function() {
           return 1;
        }
        return foo();
        var foo = function() {
           return 2;
        }
    }
    alert(outerFunction()); // Displays 1

    এটি কারণ মৃত্যুদন্ড কার্যকর করার সময় এটির মতো দেখাচ্ছে:

    function outerFunction() {
       var foo = undefined;
       var foo = undefined;
    
       foo = function() {
          return 1;
       };
       return foo ();
       foo = function() {   // This function expression is not reachable
          return 2;
       };
    }
    alert(outerFunction()); // Displays 1
  2. মনে হচ্ছে অ ফাংশন ব্লক ফাংশন ঘোষণা লিখতে নিরাপদ নয় যদি কারণ তারা প্রবেশযোগ্য হবে না।

    if (test) {
        function x() { doSomething(); }
    }
  3. নীচের মত নামযুক্ত ফাংশন এক্সপ্রেশন, সংস্করণ 9 এর পূর্বে ইন্টারনেট এক্সপ্লোরার ব্রাউজারগুলিতে কাজ করতে পারে না।

    var today = function today() {return new Date()}

1
@ অর্জুন যদি বছর আগে প্রশ্ন জিজ্ঞাসা করা হত তবে সমস্যা কি? একটি উত্তর কেবল ওপিকেই সুবিধা দেয় না তবে সম্ভাব্য সমস্ত এসও ব্যবহারকারীরা, প্রশ্নটি যখনই জিজ্ঞাসা করা হয়েছিল তা বিবেচ্য নয়। এবং ইতিমধ্যে স্বীকৃত উত্তর রয়েছে এমন প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে কী ভুল?
সান্টিবাইলার্স 5:58

1
@ অর্জুন আপনি পুরানো প্রশ্নের উত্তর বুঝতে বুঝতে পারছেন খারাপ নয়। যদি এটি হয়, এসও এরকম বাধা থাকত। কল্পনা করুন যে এপিআই-তে কোনও পরিবর্তন হয়েছে (যদিও এই প্রশ্নের প্রসঙ্গে নয়) এবং কেউ এটি স্পট করে এবং নতুন এপিআই দিয়ে একটি উত্তর সরবরাহ করে, তার অনুমতি দেওয়া উচিত নয় ?? অবধি এবং যতক্ষণ না উত্তরটি বোঝায় না এবং এটি এখানে অন্তর্ভুক্ত না হয়, তা ডাউনভোটেড এবং স্বয়ংক্রিয়ভাবে সরানো হবে। আপনার এটি নিয়ে বিরক্ত করার দরকার নেই !!!!
সুধনসু চৌধারি 21

15

আপনি যদি এই ফাংশনগুলি অবজেক্ট তৈরি করতে ব্যবহার করেন তবে আপনি পাবেন:

var objectOne = new functionOne();
console.log(objectOne.__proto__); // prints "Object {}" because constructor is an anonymous function

var objectTwo = new functionTwo();
console.log(objectTwo.__proto__); // prints "functionTwo {}" because constructor is a named function

আমি এটি পুনরুত্পাদন মনে হয় না। console.log(objectOne.__proto__);আমার কনসোলে "ফাংশনঅন্য {}" মুদ্রণ করে। কেন এটি হতে পারে তার কোনও ধারণা?
মাইকে

আমি এটির পুনরুত্পাদনও করতে পারি না।
daremkd

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

12

"নামযুক্ত ফাংশনগুলি স্ট্যাক ট্রেসগুলিতে দেখানো হয়" যুক্তির আলোকে, আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলি বেনাম ফাংশনগুলি উপস্থাপন করতে আসলে বেশ সক্ষম।

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

স্পাইডারমনকি অন্য কোনও ফাংশন থেকে ফিরে আসা একটি বেনামি ফাংশনের নামটি বের করতে পারেন। বাকিরা পারে না।

আপনি যদি সত্যিই চান যে আপনার পুনরাবৃত্তকারী এবং সাফল্যের কলব্যাকগুলি ট্রেসটিতে প্রদর্শিত হতে পারে তবে আপনি সেগুলির নামও রাখতে পারেন ...

[].forEach(function iterator() {});

তবে বেশিরভাগ অংশে এটি চাপ দেওয়ার মতো নয়।

জোতা ( ফিডাল )

'use strict';

var a = function () {
    throw new Error();
},
    b = function b() {
        throw new Error();
    },
    c = function d() {
        throw new Error();
    },
    e = {
        f: a,
        g: b,
        h: c,
        i: function () {
            throw new Error();
        },
        j: function j() {
            throw new Error();
        },
        k: function l() {
            throw new Error();
        }
    },
    m = (function () {
        return function () {
            throw new Error();
        };
    }()),
    n = (function () {
        return function n() {
            throw new Error();
        };
    }()),
    o = (function () {
        return function p() {
            throw new Error();
        };
    }());

console.log([a, b, c].concat(Object.keys(e).reduce(function (values, key) {
    return values.concat(e[key]);
}, [])).concat([m, n, o]).reduce(function (logs, func) {

    try {
        func();
    } catch (error) {
        return logs.concat('func.name: ' + func.name + '\n' +
                           'Trace:\n' +
                           error.stack);
        // Need to manually log the error object in Nitro.
    }

}, []).join('\n\n'));

V8

func.name: 
Trace:
Error
    at a (http://localhost:8000/test.js:4:11)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: b
Trace:
Error
    at b (http://localhost:8000/test.js:7:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: d
Trace:
Error
    at d (http://localhost:8000/test.js:10:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: 
Trace:
Error
    at a (http://localhost:8000/test.js:4:11)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: b
Trace:
Error
    at b (http://localhost:8000/test.js:7:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: d
Trace:
Error
    at d (http://localhost:8000/test.js:10:15)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: 
Trace:
Error
    at e.i (http://localhost:8000/test.js:17:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: j
Trace:
Error
    at j (http://localhost:8000/test.js:20:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: l
Trace:
Error
    at l (http://localhost:8000/test.js:23:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: 
Trace:
Error
    at http://localhost:8000/test.js:28:19
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: n
Trace:
Error
    at n (http://localhost:8000/test.js:33:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27

func.name: p
Trace:
Error
    at p (http://localhost:8000/test.js:38:19)
    at http://localhost:8000/test.js:47:9
    at Array.reduce (native)
    at http://localhost:8000/test.js:44:27 test.js:42

্যত

func.name: 
Trace:
a@http://localhost:8000/test.js:4:5
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: b
Trace:
b@http://localhost:8000/test.js:7:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: d
Trace:
d@http://localhost:8000/test.js:10:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: 
Trace:
a@http://localhost:8000/test.js:4:5
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: b
Trace:
b@http://localhost:8000/test.js:7:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: d
Trace:
d@http://localhost:8000/test.js:10:9
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: 
Trace:
e.i@http://localhost:8000/test.js:17:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: j
Trace:
j@http://localhost:8000/test.js:20:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: l
Trace:
l@http://localhost:8000/test.js:23:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: 
Trace:
m</<@http://localhost:8000/test.js:28:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: n
Trace:
n@http://localhost:8000/test.js:33:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1


func.name: p
Trace:
p@http://localhost:8000/test.js:38:13
@http://localhost:8000/test.js:47:9
@http://localhost:8000/test.js:54:1

চক্র

func.name: undefined
Trace:
Error
   at a (http://localhost:8000/test.js:4:5)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at b (http://localhost:8000/test.js:7:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at d (http://localhost:8000/test.js:10:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at a (http://localhost:8000/test.js:4:5)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at b (http://localhost:8000/test.js:7:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at d (http://localhost:8000/test.js:10:9)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at e.i (http://localhost:8000/test.js:17:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at j (http://localhost:8000/test.js:20:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at l (http://localhost:8000/test.js:23:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at Anonymous function (http://localhost:8000/test.js:28:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at n (http://localhost:8000/test.js:33:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)


func.name: undefined
Trace:
Error
   at p (http://localhost:8000/test.js:38:13)
   at Anonymous function (http://localhost:8000/test.js:47:9)
   at Global code (http://localhost:8000/test.js:42:1)

নিত্র

func.name: 
Trace:
a@http://localhost:8000/test.js:4:22
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: b
Trace:
b@http://localhost:8000/test.js:7:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: d
Trace:
d@http://localhost:8000/test.js:10:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: 
Trace:
a@http://localhost:8000/test.js:4:22
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: b
Trace:
b@http://localhost:8000/test.js:7:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: d
Trace:
d@http://localhost:8000/test.js:10:26
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: 
Trace:
i@http://localhost:8000/test.js:17:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: j
Trace:
j@http://localhost:8000/test.js:20:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: l
Trace:
l@http://localhost:8000/test.js:23:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: 
Trace:
http://localhost:8000/test.js:28:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: n
Trace:
n@http://localhost:8000/test.js:33:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

func.name: p
Trace:
p@http://localhost:8000/test.js:38:30
http://localhost:8000/test.js:47:13
reduce@[native code]
global code@http://localhost:8000/test.js:44:33

12

জাভাস্ক্রিপ্টে ফাংশন তৈরির দুটি উপায় রয়েছে:

  1. কার্য ঘোষণা:

    function fn(){
      console.log("Hello");
    }
    fn();

    এটি অত্যন্ত বুনিয়াদী, স্ব-ব্যাখ্যামূলক, বহু ভাষাতে ব্যবহৃত হয় এবং ভাষার সি পরিবার জুড়ে স্ট্যান্ডার্ড। আমরা একটি ফাংশন এটি সংজ্ঞায়িত করে ঘোষণা করে এটি কল করে এটি কার্যকর করি।

    আপনার যা জানা উচিত তা হ'ল ফাংশনগুলি আসলে জাভাস্ক্রিপ্টে অবজেক্ট; অভ্যন্তরীণভাবে আমরা উপরের ফাংশনের জন্য একটি অবজেক্ট তৈরি করেছি এবং এটিকে fn নাম দিয়েছি বা অবজেক্টের রেফারেন্স fn এ সংরক্ষণ করা হয়েছে। ফাংশনগুলি জাভাস্ক্রিপ্টে অবজেক্টস; ফাংশন একটি উদাহরণ আসলে একটি বস্তুর উদাহরণ।

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

    var fn=function(){
      console.log("Hello");
    }
    fn();

    জাভাস্ক্রিপ্টের প্রথম শ্রেণির ফাংশন রয়েছে, এটি একটি ফাংশন তৈরি করুন এবং এটিকে একটি ভেরিয়েবলের জন্য বরাদ্দ করুন ঠিক যেমন আপনি একটি স্ট্রিং বা সংখ্যা তৈরি করেন এবং এটি একটি ভেরিয়েবলকে বরাদ্দ করেন। এখানে, fn ভেরিয়েবল একটি ফাংশন বরাদ্দ করা হয়েছে। এই ধারণার কারণ হ'ল জাভাস্ক্রিপ্টের অবজেক্টগুলি; fn উপরের ফাংশনটির অবজেক্টের উদাহরণগুলিতে নির্দেশ করছে। আমরা একটি ফাংশন আরম্ভ করেছি এবং এটি একটি ভেরিয়েবলের জন্য নির্ধারিত করেছি। এটি ফাংশনটি সম্পাদন করে ফলাফল নির্ধারণ করে না।

তথ্যসূত্র: জাভাস্ক্রিপ্ট ফাংশন ঘোষণা সিনট্যাক্স: var fn = ফাংশন () {} বনাম ফাংশন fn () {}


1
তৃতীয় বিকল্প সম্পর্কে কি var fn = function fn() {...}?
ছারভে

হাই ছারভে, আপনার প্রশ্ন সম্পর্কে নিশ্চিত নন, আমি অনুমান করি যে আমি ইতিমধ্যে উল্লিখিত ফাংশন এক্সপ্রেশন সম্পর্কে কথা বলছি। তবে, এখনও যদি কিছু বিভ্রান্তি থাকে তবে আরও বিস্তৃত হতে হবে।
অনুপ রাই

হ্যাঁ আমি একটি নামকৃত ফাংশন এক্সপ্রেশন সম্পর্কে জিজ্ঞাসা করছিলাম । এটি আপনার বিকল্প # 2 এর সাথে সমান যা এই ফাংশনটির একটি সনাক্তকারী রয়েছে has সাধারণত এই সনাক্তকারীটি যে পরিবর্তনশীলটিকে নির্ধারিত করা হয় তার সমান, তবে সবসময় এটি হয় না।
ছারভে

1
হ্যাঁ নামযুক্ত ফাংশন এক্সপ্রেশনটি আমার বিকল্প # 2 এর মতো। ভালভাবে একটি সনাক্তকারী থাকা বাধ্যতামূলক নয় কারণ এটি ব্যবহার করা হয়নি। আপনি যখনই ফাংশন এক্সপ্রেশনটি সম্পাদন করবেন আপনি ফাংশন অবজেক্টটি ধারণ করে চলকটি ব্যবহার করবেন। সনাক্তকারী কোনও উদ্দেশ্য করে না।
অনুপ রাই

11

উভয়ই একটি ফাংশন সংজ্ঞায়নের বিভিন্ন উপায়। পার্থক্যটি হ'ল ব্রাউজার কীভাবে তাদের কার্যকর করার প্রসঙ্গে ব্যাখ্যা করে এবং এটিকে বোঝায়।

প্রথম কেসটি ফাংশন এক্সপ্রেশনগুলির হয় যা কেবল তখনই লোড হয় যখন দোভাষী দেরী কোডটিতে পৌঁছায়। সুতরাং আপনি যদি এটি নীচের মতো করে করেন তবে আপনি একটি ত্রুটি পাবেন যে ফাংশনও একটি ফাংশন নয়

functionOne();
var functionOne = function() {
    // Some code
};

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

দ্বিতীয় লাইনে আমরা ফাংশনওনে একটি বেনামি ফাংশনটির রেফারেন্স বরাদ্দ করছি।

দ্বিতীয় কেসটি ফাংশন ঘোষণার যা কোনও কোড কার্যকর করার আগে লোড হয়। সুতরাং আপনি যদি নিম্নলিখিতগুলির মতো করেন তবে কোড এক্সিকিউশন হওয়ার আগে ডিক্লেয়ারেশন লোড হওয়ায় কোনও ত্রুটি পাবেন না।

functionOne();
function functionOne() {
   // Some code
}

11

কর্মক্ষমতা সম্পর্কে:

নতুন সংস্করণগুলি V8বেশ কয়েকটি আন্ডার-হুড অপ্টিমাইজেশান প্রবর্তিত এবং এটি হয়েছিলSpiderMonkey

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

ক্রোম 62.0.3202 ক্রোম পরীক্ষা

ফায়ারফক্স 55 ফায়ারফক্স পরীক্ষা

ক্রোম ক্যানারি 63.0.3225 ক্রোম ক্যানারি পরীক্ষা


Anonymousফাংশন এক্সপ্রেশন ফাংশন এক্সপ্রেশন বিরুদ্ধে উন্নত কর্মক্ষমতা আছে বলে মনে হচ্ছেNamed


ফায়ারফক্স ক্রোম ক্যানারি ক্রোমফায়ারফক্সের নাম_অনাম ক্রোম ক্যানারি_অনামযুক্ত ক্রোম নাম_বিজ্ঞানী ous


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

@ স্কুইডবে কোন পার্থক্য নেই এখানে দেখুন: jsperf.com/empty-tests-performance
জ্যাক গিফিন

10

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

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

var functionOne = function() {
    // Some code
};

একটি ফাংশন এক্সপ্রেশন একটি ফাংশনকে বৃহত্তর এক্সপ্রেশন সিনট্যাক্সের অংশ হিসাবে ব্যাখ্যা করে (সাধারণত একটি ভেরিয়েবল অ্যাসাইনমেন্ট)। ফাংশন এক্সপ্রেশনগুলির মাধ্যমে সংজ্ঞায়িত ফাংশনগুলির নাম বা বেনামে থাকতে পারে। ফাংশন এক্সপ্রেশনগুলি অবশ্যই "ফাংশন" দিয়ে শুরু করা উচিত নয় (অতএব নীচে স্ব-চিত্তাকর্ষক উদাহরণের চারপাশে প্রথম বন্ধনী)।

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

2. কার্য ঘোষণা

function functionTwo() {
    // Some code
}

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

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

এছাড়াও, জাভাস্ক্রিপ্টে উত্তোলন কীভাবে কাজ করে সে সম্পর্কে আপনার আরও তথ্যের প্রয়োজন হলে নীচের লিঙ্কটি দেখুন:

https://developer.mozilla.org/en-US/docs/Glossary/Hoisting


1
...also this way of declaring is a better way to create Constructor functions in JavaScript, আপনি দয়া করে বিস্তারিত বলতে পারেন, আমি কৌতূহলী!
কার্ল মরিসন

একটি কারণ হ'ল জাভাস্ক্রিপ্টে সমস্ত বিল্ট-ইন কনস্ট্রাক্টর ফাংশন যেমন এই ফাংশন নম্বর () native [নেটিভ কোড] created এর মতো তৈরি হয়েছিল এবং আপনাকে বিল্ট-ইনগুলি দিয়ে বিভ্রান্ত করা উচিত নয়, পরে এই ক্ষেত্রে পরে উল্লেখ করা আরও নিরাপদ এবং আপনি শেষ করেন আরও সুন্দর কোড আপ করা হয়েছে তবে উত্তোলন ব্যবহার করা হচ্ছে না ...
আলিরেজা

8

এটি কার্যকারিতা ঘোষণার মাত্র দুটি সম্ভাব্য উপায় এবং দ্বিতীয় উপায়ে আপনি ঘোষণার আগে ফাংশনটি ব্যবহার করতে পারেন।


7

new Function()একটি স্ট্রিং মধ্যে ফাংশন এর শরীর পাস করতে ব্যবহার করা যেতে পারে। এবং তাই এটি গতিশীল ফাংশন তৈরি করতে ব্যবহার করা যেতে পারে। স্ক্রিপ্টটি কার্যকর না করে স্ক্রিপ্টটি পাস করছে।

var func = new Function("x", "y", "return x*y;");
function secondFunction(){
   var result;
   result = func(10,20);
   console.log ( result );
}

secondFunction()

যদিও এটি ভাল এবং সত্য, ঠিক কীভাবে এটি জিজ্ঞাসা করা প্রশ্নটির সাথে সম্পর্কিত?
জ্যাক গিফিন 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.