फ़ंक्शन के बजाय फ़ंक्शन के रूप में फ़ंक्शन की घोषणा


28

अधिक से अधिक मैं ऐसे कार्यों को देख रहा हूँ जिन्हें घोषित किया जा रहा है

var foo = function() {

    // things
};

इसके बजाय मैंने कैसे सीखा था, जैसे

function foo() {

    // things
}

क्या फर्क पड़ता है? बेहतर प्रदर्शन? स्कोप? क्या मुझे इस विधि का उपयोग करना चाहिए?


यह ध्यान देने योग्य है कि जावास्क्रिप्ट में, फ़ंक्शन प्रथम श्रेणी के नागरिक हैं । यह आपको वस्तुओं की तरह व्यवहार के आसपास से गुजरने की अनुमति देता है। यह कॉलबैक और प्रतिनिधिमंडल के लिए, अन्य चीजों के बीच बहुत उपयोगी है।
क्रिस बाय

स्कोप । "// चीजों" को लपेटने वाला चर नाम आवश्यक रूप से / उम्मीद है कि इसे लपेटने वाले "// चीजों" के नाम टकराव को रोका जा सकता है, जिसमें अन्य जावास्क्रिप्ट (फाइलें) शामिल हैं। इसके बारे में सोचने का एक और तरीका यह है कि आपने एक नाम "फू" बनाया है।
राडारबॉब

जवाबों:


25

var foo = function() {} एक चर को परिभाषित करता है जो एक अनाम फ़ंक्शन का संदर्भ देता है।

function foo() {}एक नामित कार्य को परिभाषित करता है foo

या तो फ़ंक्शन मापदंडों के रूप में नाम से पारित किया जा सकता है और यदि ओओपी के लिए उपयोग किया जाता है तो या तो इसे तत्काल किया जा सकता है।

दिन के अंत में, जो आप उपयोग करते हैं वह काफी हद तक आपके विशिष्ट उपयोग-मामले द्वारा निर्धारित होता है (जावास्क्रिप्ट इस तरह मज़ेदार है;))। यदि आप पूर्व का उपयोग करते हुए समाप्त होते हैं, तो मैं दृढ़ता से सुझाव दूंगा कि आप फ़ंक्शन का नाम दें:

var foo = function MY_function() {}। यह नामकरण सम्मेलन आपके डिबगर कॉलस्टैक को बेकार नहीं होने में मदद करता है।


1
समारोह में वहाँ एक
नासमझ

1
@ डिएमियन ब्रेख्त, और var foo = function foo () {...} दृष्टिकोण के बारे में क्या?
shabunc

@ शबनम: इसके बारे में क्या? यह मेरे उत्तर के अंतिम पैराग्राफ में सूचीबद्ध है।
डेमियन ब्रेख्त

@ डेमियन ब्रेख्त, नहीं, वास्तव में अंतिम पैराग्राफ चर कहा जाता है fooऔर फ़ंक्शन को कहा जाता हैMY_function
shabunc

@ शबनम: नाम कोई मायने नहीं रखता। कॉलस्टैक में मूल्य क्या मायने रखता है। एक उदाहरण के रूप में, [NAMESPACE] _ [fn नाम] मोज़िला द्वारा उपयोग किया जाने वाला सम्मेलन है। जब तक आपका कन्वेंशन आपके पूरे प्रोजेक्ट के अनुरूप नहीं होगा, तब तक यह नाम मायने नहीं रखता।
डेमियन ब्रेख्त

13

समारोह अभिव्यक्ति:

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

इस मामले में मजेदार अभिव्यक्ति अनाम है, लेकिन संदर्भ के लिए एक संस्करण को सौंपा गया है। यह निम्नलिखित तरीकों से एक लेबल फ़ंक्शन स्टेटमेंट से अलग है:

  • इसे फहराया नहीं जा सकता (इसे परिभाषित करने से पहले कहा जाता है)
  • new someFunction().constructor.name === 'someFunction';//false उदाहरणों को constructor.name के लिए var नाम नहीं मिलता है क्योंकि फ़ंक्शन का एक संदर्भ var को असाइन किया जाता है लेकिन var, फ़ंक्शन का नहीं, var नाम से बंधा होता है

एक लेबल फ़ंक्शन स्टेटमेंट में:

//someFunction(); //works when uncommented
function someFunction(){ alert('yay'); }
  • उत्थापन कार्य
  • new someFunction().constructor.name === 'someFunction'; //true नाम सीधे फ़ंक्शन से बंधा हुआ है।

आम तौर पर बोलना वास्तव में कोई बहुत बड़ा कारण नहीं है कि जब तक चीजें इधर-उधर न हो जाएं या आप एक पंक्ति में एक विधि को परिभाषित / परिभाषित नहीं कर रहे हैं, जब तक आप विफल न हों, तब तक var को अभिव्यक्ति करने का कोई बड़ा कारण नहीं है। मैं वास्तव में नीचे की तरफ आंतरिक फंक और विधि परिभाषाओं के साथ वस्तुओं को व्यवस्थित करने के लिए लहराता हुआ उपयोगी हूं, ताकि मैं वस्तु के वास्तविक व्यवहार को प्राप्त कर सकूं और एक पंक्ति की सार्वजनिक विधि परिभाषाएं (केवल 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
@ ErikReppen आप निश्चित रूप से गैर-फ़ंक्शन ब्लॉकों के भीतर एक फ़ंक्शन घोषणाओं का उपयोग नहीं कर सकते हैं (जैसे कि एक बयान के भीतर)। मैं यह नहीं जान सकता कि जहाँ मैं पढ़ता हूँ वे किसी अन्य फ़ंक्शन के भीतर उपयोग नहीं किए जा सकते।
ऑस्टिन

@Austin एक ifकथन के भीतर फ़ंक्शन परिभाषा के साथ कुछ भी गलत नहीं है !
टिम

@ ऑस्टिन: शायद आपने इसे w3schools पर पढ़ा हो? ;)
डेमियन ब्रेख्त

2
@ ErikReppen फंक्शन एक्सप्रेशन को कहीं भी इस्तेमाल किया जा सकता है। समारोह घोषणाएं नहीं हो सकती हैं। देखें stackoverflow.com/questions/10069204/…
ऑस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.