ফাংশন পরিবর্তে var হিসাবে ফাংশন ঘোষণা


28

আরও অনেক বেশি আমি ফাংশনগুলি এর মতো ঘোষিত হতে দেখছি

var foo = function() {

    // things
};

আমি কীভাবে শিখেছি তার পরিবর্তে, পছন্দ করুন

function foo() {

    // things
}

পার্থক্য কি? আরও ভাল পারফরম্যান্স? ব্যাপ্তি? আমার এই পদ্ধতিটি ব্যবহার করা উচিত?


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

ব্যাপ্তি । পরিবর্তনীয় নাম মোড়ানো "// টি জিনিস" মূলত / আশা করি এটি অন্য জাভাস্ক্রিপ্ট (ফাইল) এর সাথে অন্তর্ভুক্ত থাকা "// জিনিস" এর নাম সংঘর্ষকে আটকাচ্ছে। এটি ভাবার আরেকটি উপায় হ'ল আপনি একটি নেমস্পেস তৈরি করেছেন "ফু"।
রাডারবব :

উত্তর:


25

var foo = function() {} একটি ভেরিয়েবল সংজ্ঞায়িত করে যা একটি বেনামী ফাংশন উল্লেখ করে।

function foo() {}একটি নামকৃত ফাংশন সংজ্ঞায়িত করে foo

হয় ফাংশন প্যারামিটার হিসাবে নাম দ্বারা পাস করা যেতে পারে এবং হয় অভিপ্রেত ব্যবহার OOP এর জন্য হয় তা ইনস্ট্যান্টিয়েট করা যেতে পারে।

দিনের শেষে, আপনি যেটি ব্যবহার করেন তা আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে মূলত নির্ধারিত হয় (জাভাস্ক্রিপ্ট এর মতো মজাদার);)। আপনি যদি আগেরটি ব্যবহার করে শেষ করেন তবে আমি দৃ strongly়ভাবে পরামর্শ দেব যে আপনি ফাংশনটির নাম দিন:

var foo = function MY_function() {}। এই নামকরণ কনভেনশনটি আপনার ডিবাগার কলস্ট্যাককে অকেজো হতে সহায়তা করে।


1
() আমার ফাংশনে সেখানে একটি বোকা পেয়েছেন ...
এরিক

1
@ ডেমিয়ান ব্রেচট, এবং ভার foo = ফাংশন ফু () {...} পদ্ধতির কী হবে?
শাবঙ্ক

@ শ্যাবুনক: এটা কি? এটি আমার উত্তরের শেষ অনুচ্ছেদে তালিকাভুক্ত।
ডেমিয়ান ব্রেচট

@ ডেমিয়ান ব্রেচ্ট, না, আসলে শেষ অনুচ্ছেদে পরিবর্তনশীল বলা হয় fooএবং ফাংশন বলা হয়MY_function
শাবুনক

@ শ্যাবুনক: নামটি কিছু যায় আসে না। কী গুরুত্বপূর্ণ তা কলস্ট্যাকের মান। উদাহরণ হিসাবে, [NAMESPACE] _ [এফএন নাম] হ'ল মোজিলা ব্যবহৃত কনভেনশন। আপনার প্রকল্পটি পুরো সময় জুড়ে আপনার কনভেনশন সামঞ্জস্য থাকলে নামটি নিজেই গুরুত্বপূর্ণ নয় matter
ডেমিয়ান ব্রেচ্ট

13

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

//someFunction(); //wouldn't work when uncommented
var someFunction = function(){ alert('yay'); };

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

  • এটি উত্তোলন করা যায় না (এটি সংজ্ঞায়িত করার আগে ডাকা হয়)
  • new someFunction().constructor.name === 'someFunction';//false দৃষ্টান্তগুলি কনস্ট্রাক্টর.নামের জন্য ভের নামটি পায় না কারণ ফাংশনটির জন্য একটি উল্লেখটি ভারকে নির্ধারিত করা হয় তবে ফাংশনটি নয়, ভার নামের সাথে বাঁধা থাকে

লেবেলযুক্ত ফাংশন বিবৃতিতে:

//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
  • উত্তোলনের কাজ
  • new someFunction().constructor.name === 'someFunction'; //true নামটি সরাসরি ফাংশনে আবদ্ধ হয়।

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


8

আপনার প্রথম উদাহরণটি একটি অভিব্যক্তি, যখন দ্বিতীয় উদাহরণটি একটি বিবৃতি । এক্সপ্রেশন হিসাবে ফাংশন সংজ্ঞায়িত করা যেখানে সংজ্ঞাটি ঘটতে পারে সেখানে আরও নমনীয়তার জন্য অনুমতি দেয়, আপনি এটি কী অর্পণ করতে পারেন, আপনি এটি প্যারামিটার হিসাবে পাস করতে পারেন, ইত্যাদি ...

উদাহরণ স্বরূপ:

SomeThing('abc', function(a,b) {return a*b;});

বনাম ...

function tmp(a,b) { 
    return a*b;
}

SomeThing('abc', tmp);

আরও জটিল উদাহরণ ফাংশন এক্সপ্রেশন সিনট্যাক্স ছাড়াই নিবিড় জটিল হয়ে উঠবে।

https://stackoverflow.com/questions/111102/how-do-javascript-closures-work


4

মূল ব্যবহারিক পার্থক্য উত্তোলন হয়। উদাহরণ স্বরূপ:

foo(); // alerts 'hello'
function foo() {alert('hello');}

বনাম

foo(); // throws an error since foo is undefined
var foo = function() {alert('hello');}

এছাড়াও, এটি অনির্ধারিত আচরণ

function foo(){
  if (true) {
    function bar(){}
  }
  bar();
}

এই ঠিক আছে যখন।

function foo(){
  if (true) {
    var bar = function(){}
  }
  bar();
}

7
জেএস-এ কোনও ফাংশনের ভিতরে কোনও ফাংশন সংজ্ঞায়িত করার সাথে একেবারেই ভুল নেই। জেএসে কোনও ফাংশন সংজ্ঞায়িত করতে পারেন এমন অনেকগুলি জায়গা নেই।
এরিক রেপেন

2
@ এরিকরেপেন আপনি অবশ্যই অ-ফাংশন ব্লকগুলির মধ্যে কোনও ফাংশন ঘোষণা ব্যবহার করতে পারবেন না (যেমন যদি বিবৃতিতে থাকে তবে)। আমি কোথায় পড়েছি সেগুলি অন্য কোনও ফাংশনের মধ্যে ব্যবহার করা যাবে না বলে মনে হচ্ছে না।
অস্টিন

@ অস্টিন একটি ifবিবৃতিতে ফাংশন সংজ্ঞায় কোনও ভুল নেই !
টিম

@ অস্টিন: সম্ভবত আপনি ডাব্লু 3 স্কুলগুলিতে পড়েছেন? ;)
ডেমিয়ান ব্রাচ্ট

2
@ এরিকরেপেন ফাংশন এক্সপ্রেশনটি যে কোনও জায়গায় ব্যবহার করা যেতে পারে। ফাংশন ঘোষণাগুলি হতে পারে না। দেখুন stackoverflow.com/questions/10069204/...
অস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.