2015-01-30 4 views
6
function g() { 
    var x; 
    function y() {}; 
    var z; 
} 

मैं जानना चाहता हूं कि ऊपर दिए गए कोड को ठीक से किस क्रम में बनाया जाता है।जावास्क्रिप्ट में उछाल का आदेश

थ्योरी 1:

function g() { 
    var x; 
    function y() {}; 
    var z; 
} 

थ्योरी 2:var से पहले function रों आ रहा है: के रूप में है var और function रों के बीच आदेश बनी हुई है

function g() { 
    var x; 
    var z; 
    function y() {}; 
} 

थ्योरी 3 :function एससे पहले आते हैंएस:

function g() { 
    function y() {}; 
    var x; 
    var z; 
} 

कौन सा सिद्धांत सही है?

उत्तर

13

कार्य पहले फहराया जाता है, तो चर घोषणाओं, ECMAScript 5, section 10.5 जो निर्दिष्ट करता है कि उत्थापन होता प्रति:

हम पहला कदम 5 से निपटने समारोह घोषणाओं है:

कोड में एक FunctionDeclaration च के लिए, स्रोत पाठ में आदेश कर ...

तो चरण 8 var घोषणाओं संभालता है:

कोड में एक VariableDeclaration और VariableDeclarationNoIn घ, स्रोत पाठ आदेश कर में लिए ...

तो, कार्यों var बयानों की तुलना में अधिक प्राथमिकता दी जाती है, बाद में var बयान के बाद से किसी पूर्व-संभाला समारोह ओवरराइट नहीं कर सकते घोषणा।

function f(){} 
var f; 
console.log(f); 

var g; 
function g(){} 
console.log(g); 

दोनों log कॉल दिखाने:

तुम भी see this experimentally कर सकते हैं (। Substep 8C हालत "अगर varAlreadyDeclared झूठी है, तो है [जारी रखने के लिए ...]" इसलिए मौजूदा चर बाइंडिंग ओवरराइट नहीं कर रहे हैं लागू करता है) समारोह, undefined मूल्य नहीं।

+4

पूरी तरह से स्पष्ट होने के लिए, वह कह रहा है कि 'कार्य' var 'से पहले आया है, जो ओपी में थ्योरी 3 है। – mareoraft

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