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