Skip to content

Latest commit

 

History

History
81 lines (59 loc) · 3.51 KB

File metadata and controls

81 lines (59 loc) · 3.51 KB

Аператар delete

У 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 — выдаленне яўна прызначаных уласцівасцяў.