2012-05-09 14 views
14

व्यवहार इस छोटे स्निपेट (जिसे वैश्विक लिपि के रूप में यह निष्पादित) में देखा जा सकता साथ काम नहीं करता:चर "नाम" का उपयोग करते हुए एक जे एस वस्तु

var name = {}; 
name.FirstName = 'Tom'; 
alert(name.FirstName); 

क्रोम लेकिन कार्यों में चेतावनी पैदावार undefined आईई और फ़ायरफ़ॉक्स में। मैं भी एक अजीब मूल्य प्राप्त जब मैं

alert(name); 
+1

'language' विशेषता हटाई गई है, केवल' type' विशेषता का उपयोग । 'अलर्ट' के बजाय' console.log' का उपयोग करना और क्रोम देव का उपयोग करना बेहतर है। टूल्स (या फायरबग) उन्हें पढ़ने के लिए। और फिनली आपको अपने कोड के लाइन 1 पर एक डॉक्टरेट करने की आवश्यकता है, एक डॉक्टरेट है: '' –

+2

AFAIK भी 'var name = {}' वाक्यविन्यास का उपयोग करना अधिक आम है। – Hamish

+0

यह सिर्फ टाइपो था ... मैंने 'ऑब्जेक्ट' ऑब्जेक्ट दर्ज नहीं किया। यह अभी भी क्रोम में त्रुटि फेंकता है। क्रोम में नया कोड आज़माएं। –

उत्तर

17

window.name एक विशेष उद्देश्य है, और एक स्ट्रिंग माना जाता है है। क्रोम इसे स्पष्ट रूप से एक स्ट्रिंग पर डालने लगता है, इसलिए var name = {}; वास्तव में वैश्विक चर name (यानी window.name) "[object Object]" का मान देता है। चूंकि यह एक आदिम है, गुण (name.FirstName) "छड़ी" नहीं होगा।

इस समस्या को हल करने के लिए, वैश्विक चर के रूप में name का उपयोग न करें।

+0

अच्छी पकड़ ... मैंने चर नाम पर ध्यान नहीं दिया। –

+0

@ फ़ेलिक्सक्लिंग मैं लगभग आरक्षित शब्द की तरह 'नाम' का इलाज करता हूं, क्योंकि कुछ मेजबान एक 'नाम' संपत्ति भी प्रदान करते हैं (मुझे इससे पहले काटा गया है), बंद करने से इसे कम नहीं किया जाएगा, आदि –

+0

हाँ, वहां जहां तक ​​मुझे याद है, उस समस्या के साथ कुछ प्रश्न रहे हैं ... –

0

window.name विंडो का नाम सेट करने के लिए उपयोग किया जाता है, और चूंकि विंडो का नाम केवल एक स्ट्रिंग हो सकता है, तो आप window.name पर सेट की गई किसी भी स्ट्रिंग में परिवर्तित हो जाते हैं। और प्राचीन मूल्यों के रूप में तार, गुण नहीं हो सकता है। समाधान एक अलग चर नाम या एक अलग दायरे का उपयोग करना है।

वैकल्पिक रूप से, आप window.name का उपयोग कर सकते हैं जैसा कि आपको लगता है कि आपके पास पहले यह कोड है या नहीं। मैं तो बस अवधारणा के प्रमाण के रूप में सभी इस की सिफारिश नहीं है, लेकिन,:

(function() { 
    var _name; 
    window.__defineGetter__('name', function() { 
     return _name; 
    }); 
    window.__defineSetter__('name', function (v) { 
     _name = v; 
    }); 
})(); 

साथ ही, आपको new Object के स्थान पर {} उपयोग करना चाहिए। अधिक संक्षिप्त होने के अलावा, यह भी अधिक कुशल और अधिक स्पष्ट है।

+0

या बस 'नाम हटाएं;' – Oriol

6

आपका name वैरिएबल वास्तव में window.name है, क्योंकि var के साथ घोषित शीर्ष-स्तरीय चर वैश्विक वस्तु से जुड़े हुए हैं।

एचटीएमएल 5 spec requires that window.name is a DOMString। इसका मतलब है कि window.name का मान only be a sequence of characters, ऑब्जेक्ट नहीं हो सकता है।

क्रोम में, प्राइमेटिव स्ट्रिंग को छोड़कर कुछ भी स्टोर करने के लिए window.name का उपयोग करने का प्रयास मूल्य को एक प्राचीन स्ट्रिंग के लिए मजबूर करेगा।

window.name = {}; 
window.name === "[object Object]"; // true 

आप एक name चर कि शीर्ष स्तर के दायरे में नहीं है का उपयोग करके इस समस्या से बचने कर सकते हैं: उदाहरण के लिए:

(function() { 
    var name = {}; 
    // this `name` is not `window.name` 
    // because we're not in the top-level scope 

    console.log(name); 
})(); 
संबंधित मुद्दे