2013-02-02 20 views
16

var जावास्क्रिप्ट में कीवर्ड स्थानीय चर में एक चर को संग्रहीत करने का कारण बनता है। var चर के बिना वैश्विक दायरे से संबंधित हैं। कार्यों के बारे में क्या? यह स्पष्ट है क्या होता है जब कार्यों चरफ़ंक्शन घोषणाओं का जावास्क्रिप्ट स्कोप

var foo = function() {...} 

की तरह घोषित कर रहे हैं लेकिन क्या गुंजाइश करता

function foo() {...} 

के हैं?

संपादित करें: मुझे एहसास हुआ कि मैंने फॉलो अप के रूप में काफी सही सवाल नहीं पूछा है। बाहरी सबसे घोंसले में उपर्युक्त दो घोषणाओं और निम्नलिखित घोषणाओं के बीच कोई अंतर है?

foo = function() {...} 

उत्तर

25

यह वर्तमान दायरे के अंतर्गत आता है, हमेशा। उदाहरण के लिए:

// global scope 

// foo is a global function 
function foo() { 

    // bar is local to foo 
    function bar() { 

    } 

} 

अपने दूसरे प्रश्न के बारे में, इस:

foo = function() {...} 

एक गुमनाम समारोह अभिव्यक्ति एक वैश्विक चर करने के लिए सौंपा है (जब तक आप चला रहे हैं सख्त मोड है, तो foo अपरिभाषित जाएगा) । कि और function foo() {} के बीच अंतर यह है कि बाद के एक समारोह घोषणा (बनाम एक चर घोषणा है, जो एक गुमनाम समारोह अभिव्यक्ति असाइन किया गया है) है।

फ़ंक्शन घोषणाओं और फ़ंक्शन अभिव्यक्तियों के बारे में आपको इस उत्कृष्ट लेख में रुचि हो सकती है: Named function expressions demystified

+0

एक महान लेख है। धन्यवाद। – user1816847

+1

एक उल्लेखनीय अंतर जो मैं उल्लेख करना भूल गया था वह है कि बर्गि ने अपने जवाब में क्या कहा: फ़ंक्शन घोषणाएं फंसे हुए हैं, इसलिए आप वास्तव में स्रोत कोड में दिखाई देने से पहले फ़ंक्शन को कॉल कर सकते हैं। – bfavaretto

0

आपका पहला उदाहरण (var foo = function() {...}) को अनाम कार्य कहा जाता है। इसे रनटाइम पर गतिशील रूप से घोषित किया जाता है, और सामान्य नियम के समान नियमों का पालन नहीं करता है, लेकिन चर के नियमों का पालन करता है।

+0

जो वास्तव में भ्रमित है क्योंकि ओपी में उल्लिखित भेद के बारे में अधिक कठोर चर्चा के बिना बहुत से दस्तावेज "कार्य प्रथम श्रेणी की वस्तुएं" जैसी चीजें कहता है। – user1816847

7

फ़ंक्शन घोषणा हमेशा मौजूदा दायरे में स्थानीय होती है, जैसे var कीवर्ड के साथ घोषित एक चर।

हालांकि, अंतर यह है कि अगर वे कर रहे हैं घोषित (बजाय एक चर को सौंपना) उनकी परिभाषा फहराया है, इसलिए वे दायरे में हर जगह प्रयोग करने योग्य हो जाएगा घोषणा के अंत में आता है, भले ही कोड। var functionName = function() {} vs function functionName() {} भी देखें।

3

उल्लेखनीय अंतर को ध्यान में निहित वैश्विक लेने:

var foo = function() { 
    // Variables 
    var myVar1 = 42; // Local variable 
     myVar2 = 69; // Implicit global (no 'var') 

    // Functional Expressions 
    var myFn1 = function() { ... } // Local 
     myFn2 = function() { ... } // Implicit global 

    function sayHi() { 
    // I am a function declaration. Always local. 
    } 
} 

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