Skip to content

ru/core/delete translation added #268

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 28, 2015
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 88 additions & 0 deletions doc/ru/core/delete.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
## Оператор `delete`

Если говорить коротко, то JavaScript *невозможно* удалить глобальную переменную, функцию или любой другой объект, которому задан атрибут `DontDelete` .

### Глобальный код и код функции

Если переменная или функция определена в глобальной области видимости (scope) или в
[области видимости функции](#function.scopes), это значит что она является
свойством (property) глобального или же Activation объекта.
Подобные свойства имеют набор атрибутов, одним из которых и является
упомянутый ранее `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`](#function.this) здесь
относится к глобальному объекту и мы явно указали удаление переменной `a` как свойства
глобального объекта, что и позволи нам ее удалить.

Из-за нескольких багов в IE (как минимум 6-8) предыдущий код работать в нем не будет.

### Аргументы функций и встроенные модули (built-ins)

Обычным аргументам функций [`arguments` objects](#function.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);

### Host объекты

Host объект - это объект, предоставляемый окружением. К таким объектам относятся `window`,
`document`, `location` и так далее.
Для host объектов поведение оператора `delete` может быть непредсказуемым.
Согласно спецификации, таким объектам позволено реализовывать любой вид поведения.

### Заключение

Оператор `delete` часто обладает непредсказуемым поведением и безопасно использовать
его можно лишь для удаления явно заданных свойств обычных объектов.