2013-01-09 32 views

उत्तर

12

सशर्त बयान के अंदर कार्य घोषित करना गैर-मानक है, इसलिए ऐसा न करें। यह एक ज्ञात मुद्दा है। आप घोषणाओं के बजाय समारोह एक्सप्रेशन का उपयोग कर सकते हैं:

var f; 
if(true) { 
    f = function() { alert("yes"); }; 
} else { 
    f = function() { alert("no"); }; 
} 
f(); 

famous Kangax article on function expressions कुछ अतिरिक्त विवरण देता है:

FunctionDeclarations केवल कार्यक्रम या FunctionBody में प्रदर्शित करने की अनुमति है। इस तरह के if, while या for बयान के रूप में - वाक्य रचना, वे ब्लॉक({ ... }) में प्रकट नहीं कर सकते हैं। इसका कारण यह है ब्लाकों केवल वक्तव्य, नहीं SourceElements, जो FunctionDeclaration है शामिल कर सकते हैं।

एक ही लेख भी कहते हैं:

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

5

वी 8 (क्रोम JavaScript इंजन) bug tracker से:

नहीं एक बग। फ़ायरफ़ॉक्स एकमात्र ब्राउज़र है जो आप उम्मीद कर रहे हैं।

इस पर सफारी और आईई का व्यवहार क्रोम/वी 8 के समान है।

2

इस समारोह उत्थापन की फ़ायरफ़ॉक्स कमी के कारण होता है, के रूप में 5.

Chrome ठीक से काम के शरीर को चलाने से पहले च() करने के लिए एक मूल्य प्रदान करती है, च की तो पहले संस्करण ECMAScript में कल्पना() दूसरे द्वारा ओवरराइट किया गया है।

Spidermonkey (Firefox के JavaScript इंजन) च के लिए एक मूल्य के पूर्व assignin बिना कोड(), तो यह केवल मूल्य है कि अपने रास्ते पर मुठभेड़ों का उपयोग करता है चलाता है: function f() { alert("yes"); };

समारोह उत्थापन क्या है?
जावास्क्रिप्ट के फ़ंक्शन स्कोप का अर्थ है कि फ़ंक्शन के भीतर घोषित सभी चर 0 फ़ंक्शन के पूरे शरीर में दिखाई दे रहे हैं। उत्सुकता से, इसका मतलब यह है कि चर घोषित होने से पहले दिखाई दे रहे हैं। जावास्क्रिप्ट की यह विशेषता अनौपचारिक रूप से होस्टिंग के रूप में जानी जाती है: जावास्क्रिप्ट कोड एक समारोह में सभी परिवर्तनीय घोषणाओं के रूप में व्यवहार करता है (लेकिन संबंधित असाइनमेंट नहीं) फ़ंक्शन के शीर्ष पर "hoisted" हैं।

सूत्रों:
http://statichtml.com/2011/spidermonkey-function-hoisting.html
2011 - ओ रेली - जावास्क्रिप्ट - निश्चित गाइड 6 संस्करण