Javascript как удалить функцию

delete operator

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

Try it

Syntax

Где expression должно оцениваться как ссылка на свойство , например:

delete object.property delete object['property']

Parameters

Имя объекта или выражение,вычисляющее объект.

Return value

true для всех случаев, за исключением случаев, когда свойство является Object.hasOwn non-configurable , и в этом случае false возвращается в нестрогом режиме.

Exceptions

Выбрасывает TypeError в строгом режиме, если свойство является собственным не настраиваемым свойством.

Description

В отличие от общепринятого мнения (возможно, из-за других языков программирования, таких как delete в C++ ), оператор delete ничего общего с непосредственным освобождением памяти. Управление памятью осуществляется косвенно, путем разрыва ссылок. Подробнее см. на странице управления памятью .

Оператор delete удаляет заданное свойство из объекта. При успешном удалении он вернет true , иначе будет возвращено false .

Однако важно учитывать следующие сценарии:

  • Если свойство, которое вы пытаетесь удалить, не существует, delete не будет иметь никакого эффекта и вернет true .
  • Если свойство с таким же именем существует в цепочке прототипов объекта, то после удаления объект будет использовать свойство из цепочки прототипов (другими словами, delete влияет только на собственные свойства).
  • Любое свойство, объявленное с помощью var , нельзя удалить из глобальной области видимости или из области видимости функции.
    • Таким образом, delete не может удалить какие-либо функции в глобальной области (независимо от того, является ли это частью определения функции или выражения функции).
    • Функции, которые являются частью объекта (помимо глобальной области), можно удалить с помощью delete .

    Следующий отрывок дает простой пример:

    const Employee = < age: 28, name: 'abc', designation: 'developer' > console.log(delete Employee.name); // возвращает истину console.log(delete Employee.age); // возвращает истину // При попытке удалить свойство, которое // не существует, возвращается истина console.log(delete Employee.salary); // возвращает истину 

    Non-configurable properties

    Когда свойство помечено как не настраиваемое, delete не будет иметь никакого эффекта и вернет false . В строгом режиме это вызовет TypeError .

    const Employee = <>; Object.defineProperty(Employee, 'name', < configurable: false >); console.log(delete Employee.name); // возвращает false 

    var , let и const создают ненастраиваемые свойства, которые нельзя удалить с помощьюоператора delete :

    var nameOther = 'XYZ'; // Мы можем получить доступ к этому глобальному свойству, используя: Object.getOwnPropertyDescriptor(window, 'nameOther'); // вывод: Object // доступно для записи: true, // перечислимый: true, // настраивается: false> // Поскольку "nameOther" добавляется с помощью // ключевое слово var, оно помечено как "не настраиваемое" delete nameOther; // возвращаем false 

    В строгом режиме это вызвало бы исключение.

    Строгий и нестрогий режим

    В строгом режиме, если delete используется для прямой ссылки на переменную, аргумент функции или имя функции, он выдаст SyntaxError . Поэтому, чтобы избежать синтаксических ошибок в строгом режиме, вы должны использовать оператор delete в форме delete object.property или delete object[‘property’] .

    Object.defineProperty(globalThis, 'variable1', < value: 10, configurable: true, >); Object.defineProperty(globalThis, 'variable2', < value: 10, configurable: false, >); // SyntaxError в строгом режиме. console.log(delete variable1); // true // SyntaxError в строгом режиме. console.log(delete variable2); // false 
    function func(param) < // SyntaxError в строгом режиме. console.log(delete param); // false > // SyntaxError в строгом режиме. console.log(delete func); // false 

    Cross-browser notes

    Согласно современной спецификации ECMAScript порядок обхода свойств объекта четко определен и стабилен в разных реализациях. Однако в случае Internet Explorer, когда кто-то использует delete свойства, возникает некоторое запутанное поведение, не позволяющее другим браузерам использовать простые объекты, такие как литералы объектов, в качестве упорядоченных ассоциативных массивов. В проводнике, несмотря на то, что значение свойства действительно установлено на undefined , если позднее добавить обратно свойство с тем же именем, свойство будет повторяться в своей старой позиции, а не в конце последовательности итераций, как можно было бы ожидать после удалил свойство, а затем добавил его обратно.

    Если вы хотите использовать упорядоченный ассоциативный массив с поддержкой старых сред выполнения, используйте объект Map , если он доступен (например, с помощью полифилла), или смоделируйте эту структуру с двумя отдельными массивами (один для ключей, а другой для значений). или создать массив объектов с одним свойством и т. д.

    Examples

    // Создает свойство adminName в глобальной области. adminName = 'xyz'; // Создает свойство empCount в глобальной области видимости. //Поскольку мы используем var,это помечено как неконфигурируемое. var empCount = 43; EmployeeDetails = < name: 'xyz', age: 5, designation: 'Developer' >; // adminName - это свойство глобальной области видимости. // Его можно удалить, так как он создан без var, // и поэтому его можно настроить. delete adminName; // возвращает истину // Напротив, empCount не настраивается // поскольку использовалась var. delete empCount; // возвращает false // delete может использоваться для удаления свойств из объектов. delete EmployeeDetails.name; // возвращает истину // Даже если свойство не существует, delete возвращает "true". delete EmployeeDetails.salary; // возвращает истину // удаление не влияет на встроенные статические свойства. delete Math.PI; // возвращает false // EmployeeDetails - это свойство глобальной области видимости. // Поскольку он был определен без "var", он помечен как настраиваемый. delete EmployeeDetails; // возвращает истину function f( ) < var z = 44; // удаление не влияет на имена локальных переменных delete z; // возвращает false >

    удаление и цепочка прототипов

    В следующем примере мы удаляем собственное свойство объекта,в то время как одноименное свойство доступно в цепочке прототипов:

    function Foo( ) < this.bar = 10; > Foo.prototype.bar = 42; const foo = new Foo(); // foo.bar связан с // собственность. console.log(foo.bar); // 10 // Удаляем собственное свойство внутри // объект foo. delete foo.bar; // возвращает истину // foo.bar по-прежнему доступен в // цепочка прототипов. console.log(foo.bar); // 42 // Удаляем свойство прототипа. delete Foo.prototype.bar; // возвращает истину // Свойство "bar" больше не может быть // унаследовано от Foo, поскольку оно было // deleted. console.log(foo.bar); // undefined 

    Удаление элементов массива

    Когда вы удаляете элемент массива, length массива не изменяется. Это сохраняется, даже если вы удалите последний элемент массива.

    Когда оператор delete удаляет элемент массива, этого элемента больше нет в массиве. В следующем примере trees[3] удаляются с помощью delete .

    const trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; delete trees[3]; console.log(3 in trees); // false 

    Если вы хотите, чтобы элемент массива существовал, но имел неопределенное значение, используйте undefined значение вместо оператора delete . В следующем примере trees[3] присваивается значение undefined , но элемент массива все еще существует:

    const trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; trees[3] = undefined; console.log(3 in trees); // true 

    Если вместо этого вы хотите удалить элемент массива, изменив его содержимое, используйте метод splice() . В следующем примере trees[3] удаляется из массива с помощью splice() :

    const trees = ['redwood', 'bay', 'cedar', 'oak', 'maple']; trees.splice(3, 1); console.log(trees); // ["redwood", "bay", "cedar", "maple"]

    Specifications

    Источник

    Полное удаление созданной JS-функции с освобождением памяти в DOM. Есть ли реально рабочий код?

    Вот нужен такой функционал по выгрузке функций из памяти, но посмотрев в интернете — не нашёл ответа, что это можно делать как-то в принципе.
    Все пишут, что можно только подменить функцию на «пустышку» window.foo=function()<> . Но это — не вариант, т.к. не освобождает память.

    Может кто сталкивался уже с подобной задачей?
    Поделитесь, пожалуйста.

    Заранее, Благодарю всех за помощь!

    Средний 24 комментария

    ProjectSoft

    window.foo=function()<>
    Нет. Вы перезаписали функцию
    delete window.fo;
    Вот теперь вы удалили ссылку на функцию.
    А дальше сборщик мусора сделает сам освобождение памяти. Этот процесс автоматический.

    ProjectSoft

    var foo = function() < console.log('body foo'); >delete foo; foo(); //console: "body foo"

    Артём Петренков, Да мне не часто нужно её вызывать: главное — чтобы срабатывало корректно: сборщик освобождал память.

    ProjectSoft

    xmoonlight, да. Ссылка сохранилась.
    Сделав тесты понял, что пока в коде есть ссылка(упоминание) на вызов функции — сборщик её не удалит.
    Т. е. если вы где-то попытались удалить функцию, а через какое-то время её вызвали — сборщик мусора не удалит ссылку.
    Хотя если в консоли писать поэтапно — ссылка удалиться. Ибо интерпретатор не знает, что вы введёте в консоль.

    Из этого получается вопрос, что именно вы хотите получить на выходе?

    PS:
    Когда-то на Flash мы могли убить только объекты. С функциями было сложнее.

    Источник

    Javascript удалить функцию

    Если вы установите для него значение null, это будет так же хорошо, как и удалено, поскольку сама функция больше не будет существовать в памяти (при условии, что у вас нет других ссылок на нее, и что фактическая сборка мусора может быть не мгновенной).

    почему ты хочешь сделать это? Какова реальная цель? Я подозреваю, что удаление функции не обязательно, чтобы достичь ее.

    3 ответа

    Нет, вы не можете delete получить результат объявления .

    Если вы посмотрите описание оператора delete в JavaScript:

    Если вы заходите в браузер и запускаете в консоли следующее:

    >function f()<> >Object.getOwnPropertyDescriptor(window,"f") 

    Что можно сделать:

    Однако вы можете присвоить результат другому значению, которое не является функцией, предполагая, что это ваша последняя ссылка на эту функцию, сбор мусора будет происходить, и он будет удален.

    Для всех целей, отличных от getOwnPropertyNames hasOwnProperty и таких, что-то вроде f = undefined должно работать. Для этих случаев вы можете вместо этого использовать функциюExpression и назначить это переменной вместо этого. Однако для таких целей, как hasOwnProperty , это не удастся, попробуйте в консоли!

    function f()<> f = undefined; window.hasOwnProperty("f");//true 

    Некоторые примечания по удалению

    • Когда ваш современный браузер видит оператор delete , который заставляет его падать в режим хэш-карты на объектах, поэтому delete может быть очень медленно (perf).
    • На управляемом языке с сборщиком мусора использование delete может оказаться проблематичным. Вам не нужно обрабатывать вашу память, язык делает это для вас.
    • В случае, если вы хотите использовать объекты, такие как карта, действительный прецедент и он на пути:)

    @alex23 alex23 Обратите внимание, что я никогда не утверждаю, что функция не может быть удалена, но объявление функции не может быть удалено. Объявления функций (я связался со спецификацией) — это когда вы делаете что-то вроде function myFunction()< а не когда вы делаете var a = function()< или obj.property = function()< (Это объявления переменных и объявления свойств объекта с последующим присвоением выражению функции ). Это хороший момент, хотя тот факт, что мой ответ не был понятен для вас, означает, что, вероятно, он не будет понятен и другим людям, что делает эти (и ваши) комментарии полезными 🙂

    Я явно имел в виду «функция, объявленная с объявлением функции», объявление функции является частью кода 🙂

    delete работает только для свойств объектов. Если test() находился внутри объекта, вы можете его удалить, но если это автономная функция, вы застряли с ней, если вы не скроете ее или не определите ее как что-то еще.

    Удаление объекта

    var obj = < test: function() < console.log("I'm a test"); >> obj.test(); //I'm a test delete obj.test; obj.test(); //Nothin' 

    Функция переназначения

    function test() < console.log("I'm a test"); >test(); // I'm a test delete test; test = undefined; test(); // TypeError 

    Источник

    Читайте также:  Html задание размера страницы
Оцените статью