this question के उत्तरों में, हम पढ़ते हैं कि function f() {}
स्थानीय रूप से नाम परिभाषित करता है, जबकि [var] f = function() {}
इसे विश्व स्तर पर परिभाषित करता है। यह मेरे लिए सही मायने रखता है, लेकिन कुछ अजीब व्यवहार है जो दो घोषणाओं के बीच अलग है।जावास्क्रिप्ट: "ऑनलोड = फ़ंक्शन() {}" से अलग "फ़ंक्शन ऑनलोड() {}" कैसे है?
मैं स्क्रिप्ट
onload = function() {
alert("hello");
}
साथ एक HTML पृष्ठ बना दिया है और यह उम्मीद के रूप में काम किया। जब मैंने इसे
function onload() {
alert("hello");
}
कुछ भी नहीं हुआ। (फ़ायरफ़ॉक्स ने अभी भी घटना को निकाल दिया है, लेकिन वेबकिट, ओपेरा और इंटरनेट एक्सप्लोरर ने नहीं किया है, हालांकि स्पष्ट रूप से मुझे नहीं पता कि कौन सा सही है।)
दोनों मामलों में (सभी ब्राउज़रों में), मैं सत्यापित कर सकता हूं कि window.onload
दोनों और onload
फ़ंक्शन पर सेट किए गए थे। दोनों स्थितियों में, वैश्विक वस्तु this
विंडो पर सेट है, और कोई फर्क नहीं पड़ता कि मैं घोषणा कैसे लिखता हूं, window
ऑब्जेक्ट संपत्ति को ठीक से प्राप्त कर रहा है।
यहां क्या हो रहा है? एक घोषणा दूसरे से अलग क्यों काम करती है? क्या यह जावास्क्रिप्ट भाषा, डीओएम, या दोनों के बीच बातचीत का एक quirk है?
मुझे संदेह है कि यह वेबकिट/ओपेरा में एक बग है और फ़ायरफ़ॉक्स का सही व्यवहार है। – Wogan
न तो सही है। वैश्विक वस्तु (जिस पर 'विंडो' संदर्भित है) में होस्ट परिभाषित गुण हो सकते हैं (जैसे कि' ऑनलोड') और एक ईसीएमएस्क्रिप्ट 3 कार्यान्वयन ऐसी संपत्ति के व्यवहार को लागू करने के लिए स्वतंत्र है, जैसा कि यह उपयुक्त दिखता है, जिसमें आंतरिक '[[Put ]] 'विधि जिसे कहा जाता है जब संपत्ति का मूल्य असाइन किया जाता है। –
फ़ायरफ़ॉक्स 3.5.5 में, अगर मैं 'onload = function() {...} का उपयोग करता हूं, तो मुझे अलर्ट दिखाई देता है, लेकिन' var onload = function() {...}; ' –