У JavaScript немагчыма выдаліць глабальныя пераменныя, функцыі і некаторыя іншыя
рэчы, што маюць атрыбут DontDelete.
Калі пераменная або функцыя аб'яўленыя ў глабальнай зоне бачнасці, або зоне бачнасці
функцыі то яна будзе ўласцівасцю або аб'екта актывацыі, або
глабальнай зоны бачнасці. Такія ўласцівасці маюць набор атрыбутаў, адзін з іх —
DontDelete. Пераменныя і функцыі, аб'яўленыя ў глабальнай зоне бачнасці і зоне
бачнасці функцыі, заўсёды ствараюцца з уласцівасцю DontDelete, а таму не могуць
быць выдаленыя.
// глабальная пераменная:
var a = 1; // мае ўласцівасць DontDelete
delete a; // false
a; // 1
// звычайная функцыя:
function f() {} // мае ўласціваць DontDelete
delete f; // false
typeof f; // "function"
// перапрызначэнне не дапамагае:
f = 1;
delete f; // false
f; // 1
Яўна прызначаныя ўласцівасці могуць быць лёгка выдаленыя.
// яўна прызначаныя ўласцівасці:
var obj = {x: 1};
obj.y = 2;
delete obj.x; // true
delete obj.y; // true
obj.x; // undefined
obj.y; // undefined
У вышэйпрыведзеным прыкладзе, obj.x і obj.y могуць быць выдаленыя, бо не маюць
атрыбута DontDelete. Таму і прыкад ніжэй працуе:
// Гэта працуе правільна, акрамя IE:
var GLOBAL_OBJECT = this;
GLOBAL_OBJECT.a = 1;
a === GLOBAL_OBJECT.a; // true — глабальная пераменная
delete GLOBAL_OBJECT.a; // true
GLOBAL_OBJECT.a; // undefined
Гэта прыём, каб выдаліць a. this спасылаецца на глабальны
аб'ект, і мы яўна аб'яўляем пераменную a як яго ўласцівасць, што дазваляе нам
выдаліць яе.
IE (прынамсі 6-8) мае хібы, таму вышэйпрыведзены код там працаваць не будзе.
Звычайныя аргументы функцыі, аб'ект arguments, а таксама
убудаваныя ўласцівасці таксама маюць атрыбут DontDelete.
// аргументы функцыі і ўласцівасці:
(function (x) {
delete arguments; // false
typeof arguments; // "object"
delete x; // false
x; // 1
function f(){}
delete f.length; // false
typeof f.length; // "number"
})(1);
Аператар delete часта паводзіць сябе нечакана, таму адзінае надзейнае выкарыстанне
delete — выдаленне яўна прызначаных уласцівасцяў.