2012-12-13 16 views
5

अगर मैं गूगल क्रोम कंसोल में निम्न कोड को चलाने मैं निम्नलिखित परिणामeval बयान निर्माणों के बारे में और हटाने के

var x = 1; 

alert(delete x); // false 

eval('var y = 2'); 

alert(delete y); // true 

क्यों पहले उदाहरण में चर को हटाया नहीं जाता है और में दूसरा उदाहरण यह हटा दिया गया है?

+6

बोनस प्रश्न: आपको इसकी आवश्यकता क्यों होगी? –

+1

मैं आपको कोई तकनीकी विवरण नहीं दे सकता, लेकिन मुझे संदेह है कि यह जावास्क्रिप्ट के "[hoisting] (http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting)" व्यवहार से संबंधित है। अनिवार्य रूप से, 'var foo' के साथ परिभाषित चर; विशेष उपचार प्राप्त करें, क्योंकि जेएस इंजन जानता है कि वे फ़ंक्शन चलाने से पहले वहां हैं।'Eval' के साथ घोषित वैरिएबल को पहचाना नहीं गया है, और इस प्रकार यह विशेष उपचार नहीं मिलता है। –

+0

आपने http://perfectionkills.com/understanding-delete/ पढ़ा है? – Bergi

उत्तर

1

From the Mozilla JS Docs for delete:

delete एक वस्तु के गुणों पर ही प्रभावी है। इसका प्रभाव पर परिवर्तनीय या फ़ंक्शन नामों पर नहीं है।

प्रदान किया गया उदाहरण आपके जैसा ही है।

x = 42;   // creates the property x on the global object 
var y = 43;  // declares a new variable, y 

delete x;  // returns true (x is a property of the global object and can be deleted) 
delete y;  // returns false (delete doesn't affect variable names) 

तो, alert(delete y); क्यों काम करता है? मैं सही जवाब को कम नहीं कर सका, लेकिन मूल रूप से आप eval के दायरे पर भरोसा नहीं कर सकते हैं।

मुझे लगता है कि eval('var y = 2'); एक चर के रूप में घोषित नहीं करता है हो और एक संपत्ति रूप में व्यवहार किया जाता है, लेकिन मुझे लगता है कि अभी तक हमारे परीक्षणों के परिणामों के अलावा अन्य के लिए सबूत नहीं मिला है। मैं यह देखने के लिए शोध जारी रखने जा रहा हूं कि मुझे सही कारण मिल रहा है या नहीं।

eval weirdness पर अन्य लेख:


संपादित करें 0

@Xavier Holt की टिप्पणी के आधार पर, मैंने eval के संबंध में उत्थान और दायरा देखा। This scope cheatsheet from Mozilla Dev docs निम्नलिखित था:

eval कार्य पर कब्जा सकता है, लेकिन नहीं वर घोषणाओं

eval'd वार्स तो evals कार्य पर कब्जा कर सकते हैं समान करने के लिए, सामान्य रूप से फहराने के साथ:

function f() { { 
    let x = "inner"; 
    eval("var x = 'outer'"); 
    print(x); // "outer" } 
} 

अगर मैं इसे सही ढंग से पढ़ रहा हूं, तो मेरी पिछली धारणा सही थी। eval() एक चर घोषित करके var घोषणाओं का मूल्यांकन नहीं करता है। इसे काम करने के लिए delete के लिए एक संपत्ति बनाना चाहिए या संपत्ति के रूप में माना जाना चाहिए।