2011-03-25 18 views
14

b/w समारोह घोषणा & समारोह अभिव्यक्ति खूबसूरती से var functionName = function() {} vs function functionName() {}
में वर्णन किया गया इस में यह है कि समारोह घोषणा पार्स-समय के दौरान मूल्यांकन किया जाता है उल्लेख किया गया है अंतर, & समारोह अभिव्यक्ति निष्पादन चरणफ़ंक्शन अभिव्यक्ति की तुलना में फ़ंक्शन घोषणा तेज है?

में मूल्यांकन किया जाता है bytes.com में यह है उल्लेख किया है कि फ़ंक्शन अभिव्यक्ति फ़ंक्शन अभिव्यक्ति से तेज है। http://jsperf.com/function-declaration-vs-function-expression

समारोह घोषणा:

function myfunc() { 
alert("yo"); 
} 
myfunc(); 

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

var myfunc = function() { 
alert("yo"); 
} 
myfunc(); 

परीक्षण से पता चला कि समारोह अभिव्यक्ति है

मैं इस के लिए एक बुनियादी परीक्षण का मामला बनाया 90% धीमी टी हन समारोह घोषणा

गति में इतना अंतर क्यों?

संपादित:
परिणामों से http://jsperf.com/function-declaration-vs-function-expression

Chrome, IE9, Opera & Safari में -> समारोह घोषणा समारोह अभिव्यक्ति की तुलना में तेजी है

Firefox, IE7, IE8 में -> समारोह अभिव्यक्ति समारोह घोषणा की तुलना में तेजी है

में आईई 9 फ़ंक्शन घोषणा तेज है, जबकि आईई 7में 210 8 फ़ंक्शन अभिव्यक्ति तेज़ है। क्या यह आईई 9 में जावास्क्रिप्ट इंजन में बदलाव की वजह से है, या यह कदम जानबूझकर था?

+3

आप किस ब्राउज़र या जावास्क्रिप्ट इंजन का उपयोग कर रहे हैं? –

+0

यह वास्तव में फ़ायरफ़ॉक्स में तेज़ है। –

+3

ये परिणाम बहुत दिलचस्प हैं, जबकि यह क्रोम और ओपेरा में 90% धीमी है, यह वास्तव में एफएफ में तेज़ है। मैं कहूंगा कि इससे कोई फर्क नहीं पड़ता है, क्योंकि यदि आप पर्याप्त कार्यों की घोषणा कर रहे हैं कि यह कोई मुद्दा बन गया है, तो आप कुछ गलत कर रहे हैं। – idbentley

उत्तर

1

यह एक ब्राउज़र निर्भर मुद्दा होना चाहिए। कुछ ब्राउज़र जावास्क्रिप्ट को अलग-अलग संकलित कर सकते हैं यदि यह घोषणा के बजाए अभिव्यक्ति है और कुछ उन्हें बिल्कुल वही व्यवहार कर सकते हैं।

2

फ़ायरफ़ॉक्स में गैर-मानक Function Statements भी है, जो कार्य घोषणाओं (प्रति spec, आप नहीं कर सकते हैं) के बीच सशर्त रूप से चुनना संभव बनाता है। बजाय पार्स चरण में की,

if (true) { 
    function foo(){ return 1; } 
} else { 
    function foo(){ return 2; } 
} 
foo(); // 1 
// Note that other clients interpet `foo` as function declaration here, 
// overwriting first `foo` with the second one, and producing "2", not "1" as a result 

इसलिए उन निष्पादन समय पर संकलित किए जाते हैं:: बस एक example of Juriy "kangax" Zaytsev का उपयोग कर

समारोह बयान चर इन्स्टेन्शियशन के दौरान घोषित नहीं हैं। उन्हें कार्य समय की तरह रन टाइम पर घोषित किया जाता है।

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

+0

_ "फ़ायरफ़ॉक्स को रन टाइम पर फ़ंक्शन घोषणाओं की व्याख्या करना है" _ यह बुरा है। क्या यह नए संस्करणों में तय है? – Anish

+0

@ अनीश: फिक्स्ड? यह एक [फीचर] है (https://developer.mozilla.org/en/JavaScript/Reference/Statements/function): "जावास्क्रिप्ट 1.5, एनईएस 6.0: सशर्त फ़ंक्शन घोषणाएं (नेटस्केप एक्सटेंशन) जोड़ा गया"। उस ने कहा, टीम जेएस इंजन को जितनी जल्दी हो सके बनाने के लिए काम कर रही है। –

+0

_ कंगैक्स के आलेख_ से मैं समझता हूं कि फ़ायरफ़ॉक्स केवल रन समय पर फ़ंक्शन घोषणाओं को व्याख्या करता है यदि वे फ़ंक्शन स्टेटमेंट का हिस्सा हैं। जब कार्य घोषणा सामान्य रूप से परिभाषित की जाती है, तो मुझे लगता है कि उन्हें पार्स समय के दौरान परिभाषित किया गया है? – Anish

संबंधित मुद्दे