2015-06-28 19 views
18
var test = function() { 

    'use strict'; 

    var mapNames = { 
     'name': 'City Name:', 
     'coord.lat': 'Latitute:' 
    }; 

    for (var key in mapNames) { 

     var names; 

     if (mapNames[key]) { 
      name = mapNames[key]; 
     } else { 
      name = key; 
     } 
    } 

    console.log(name); 

} 

test(); 

उपरोक्त कोड में मैंने परिवर्तनीय names घोषित करके और name का उपयोग करके गलती की है। मैंने सोचा कि 'सख्त' मोड इसे पकड़ लेगा लेकिन ऐसा नहीं हुआ। क्या इस मामले में कोई त्रुटि नहीं डालना चाहिए?जावास्क्रिप्ट 'सख्त मोड' अपेक्षित काम नहीं कर रहा है?

उत्तर

25

name वैश्विक चर पहले से मौजूद है, आपके कोड से संबंधित नहीं है; यह वर्तमान विंडो के नाम का प्रतिनिधित्व करता है, इसलिए आप पहले से मौजूद चर के लिए असाइन कर रहे हैं। window पर

window.name; // the name of the current window for cross-window communication 

सब कुछ एक वैश्विक रूप में घोषित किया जाता है - तो इसे संदर्भ-erroring नहीं है, क्योंकि यह एक बाहरी दायरे में एक चर को असाइन किया गया है।

सुपर भ्रामक: डी


"use strict" नई वैश्विक चर को परिभाषित रोका जा सके, यहाँ हम एक मौजूदा चर करने के लिए एक काम कर रहे हैं, इसके बारे में लगता है के रूप में name वैश्विक क्षेत्र में है, window.Blob, window.console और इतने पर की तरह।

+0

को "सख्त उपयोग" नहीं करना चाहिए, ठीक उसी तरह से रोकें? –

+3

@JanDvorak '" सख्त उपयोग "' नए वैश्विक चर को परिभाषित करने से रोक देगा, यहां हम मौजूदा चर _ को असाइनमेंट कर रहे हैं, इसके बारे में सोचें क्योंकि 'नाम' वैश्विक दायरे में है, जैसे 'विंडो। ब्लॉब', 'विंडो। कंसोल 'और इतने पर। –

+0

आह, ब्राउज़र पहले से ही उस नाम के साथ एक चर प्रदान करता है। क्या हमारे पास एक सुपर-सख्त मोड हो सकता है जहां ग्लोबल्स को नाम से एक्सेस नहीं किया जा सकता है? :-) –

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