Как я могу отключить переменную JavaScript?

У меня есть глобальная переменная в JavaScript (на самом деле свойство window, но я не думаю, что это имеет значение), которая уже была заполнена предыдущим скриптом, но мне не нужен другой скрипт, который будет запущен позже, чтобы увидеть его значение или что оно было даже определил.

Я поставил some_var = undefined, и он работает с целью тестирования typeof some_var == "undefined", но я действительно не думаю, что это правильный путь.

Что вы думаете?


person Guss    schedule 20.10.2009    source источник


Ответы (12)


Оператор delete удаляет свойство объекта. Он не может удалить переменную. Таким образом, ответ на вопрос зависит от того, как определяется глобальная переменная или свойство.

(1) Если он создан с var, его нельзя удалить.

Например:

var g_a = 1; //create with var, g_a is a variable 
delete g_a; //return false
console.log(g_a); //g_a is still 1

(2) Если он создан без var, его можно удалить.

g_b = 1; //create without var, g_b is a property 
delete g_b; //return true
console.log(g_b); //error, g_b is not defined

Техническое объяснение

1. Использование var

В этом случае ссылка g_a создается в том, что спецификация ECMAScript называет VariableEnvironment, который присоединен к текущей области - это может быть контекст выполнения функции в случае использования var внутри функции (хотя это может быть немного сложнее, если учесть let) или в случае глобального кода VariableEnvironment присоединяется к глобальному объекту (часто window).

Ссылки в VariableEnvironment обычно не удаляются - процесс подробно описан в ECMAScript 10.5 объясняет это подробно, но достаточно сказать, что если ваш код не выполняется в eval контексте (который используется в большинстве консолей разработки на основе браузера), переменные, объявленные с помощью var, не могут быть удалены.

2. Без использования var

При попытке присвоить значение имени без использования ключевого слова var Javascript пытается найти указанную ссылку в том, что спецификация ECMAScript называет LexicalEnvironment, и главное отличие состоит в том, что LexicalEnvironment вложены, то есть LexicalEnvironment имеет родительский элемент (то, что спецификация ECMAScript называет ссылкой на внешнюю среду), и когда Javascript не может найти ссылку в LexicalEnvironment, он ищет в родительском LexicalEnvironment ( как подробно описано в 10.3.1 и 10.2.2.1). Верхний уровень LexicalEnvironment - это < em> global environment, и это связано с глобальным объектом в том смысле, что его ссылки являются свойствами глобального объекта. Поэтому, если вы попытаетесь получить доступ к имени, которое не было объявлено с использованием ключевого слова var в текущей области или любых внешних областях, Javascript в конечном итоге получит свойство объекта window, которое будет служить этой ссылкой. Как мы узнали ранее, свойства объектов можно удалять.

Примечания

  1. Важно помнить, что объявления var подняты - т.е. они всегда считаются произошедшими в начале области, в которой они находятся, - хотя не инициализация значения, которая может быть выполнена в операторе var, - которое остается там, где оно есть. . Итак, в следующем коде a - это ссылка из VariableEnvironment, а не на свойство window, и его значение будет 10 в конце кода:

    function test() { a = 5; var a = 10; }
    
  2. Вышеупомянутое обсуждение касается случая, когда строгий режим не включен. Правила поиска немного отличаются при использовании строгого режима, и лексические ссылки, которые были бы разрешены в свойствах окна без строгого режима, вызовут необъявленные ошибки переменных в строгом режиме. Я действительно не понял, где это указано, но это то, как ведут себя браузеры.

person Dayong    schedule 18.09.2014
comment
То, что вы сказали, является распространенным заблуждением, но на самом деле неверно - в Javascript нет глобальных переменных. Переменные, определенные без явной области видимости (например, использование var вне функции), являются свойствами глобального объекта, которым в веб-браузерах является window. Итак - var a = 1; delete window.a; console.log(a); успешно удалит переменную и заставит последнюю строку выдать ошибку ссылки. - person Guss; 20.09.2014
comment
@Guss, ваш код var a = 1; delete window.a; console.log(a); отображает 1. - person Dayong; 22.09.2014
comment
Какой браузер вы используете? - person Guss; 22.09.2014
comment
Я использую Google Chrome v36. Я тестировал в других браузерах. Похоже, кроссбраузеры несовместимы. Chrome и Opera отображали 1, в то время как Firefox, Safari и IE 11 на моем компьютере выдавали ошибку. - person Dayong; 22.09.2014
comment
В ECMA-262 v5.1 сказано следующее: каждый контекст выполнения имеет связанную с ним VariableEnvironment. Переменные и функции, объявленные в коде ECMAScript, оцениваемые в контексте выполнения, добавляются как привязки в записи среды этой VariableEnvironment; а также: Запись среды глобальной среды - это запись среды объекта, объект привязки которой является глобальным объектом. Итак, если после выполнения приведенного выше примера кода window.a == 1, браузер нарушает ECMA-262. - person Guss; 23.09.2014
comment
Насколько я могу судить, Chrome window - это волшебство, и вы не можете удалить даже его определенные пользователем свойства, которые объясняют описанное вами поведение, но не оправдывают это нарушение стандарта. - person Guss; 23.09.2014
comment
Может быть, это потому, что браузеры постепенно адаптируются к стандарту. У меня нет старых версий Firefox, Safari или IE для проверки. Но я предполагаю, что были некоторые старые версии, в которых window.a == 1. - person Dayong; 25.09.2014
comment
Хорошо, моя ошибка. См. ecma-international.org/ecma-262/5.1/#sec -10.5 (подпункты 2 и 8.c.ii): при запуске моего теста в консоли разработчика он обычно считается контекстом eval (хотя, возможно, и не в Chrome), поэтому он вызовет ошибку. Один и тот же код в глобальном контексте реального документа будет правильно выводить 1 во всех браузерах. В реальных документах ваши примеры кода верны. Я выбрал ваш ответ как правильный, но был бы признателен, если бы вы отредактировали его, включив в него пояснение window.a = 1; delete window.a; и, возможно, механизм. Я тоже могу это сделать, если вы не против. - person Guss; 29.09.2014
comment
@Dayong Что происходит с переменными с областью видимости? Разве они не удаляются браузером автоматически? - person Klaider; 07.06.2016
comment
@KlaiderKlai да. Переменные в области видимости функции создаются и уничтожаются каждый раз, когда функция выполняется. Наверное, закрытие - исключение. - person Dayong; 08.06.2016
comment
Нет шансов для classes - person Green; 08.12.2016
comment
Chrome: var a = 1; delete window.a; console.log(a); отображает 1, а затем undefined, потому что 1 для первого var a=1, а затем undefined для console.log - person serge; 22.01.2018
comment
Что плохого в том, чтобы просто вернуть значение undefined? - person thdoan; 02.06.2018
comment
Рекомендуемый ответ - использовать объект со свойством - например, obj.a = 1 - затем удалить это свойство - удалить obj.a - затем сослаться на него - obj.a. Не использовать use strict только для устаревшего кода. Написание кода, который ведет себя по-разному под строгим и не строгим, опасно. Javascript полон кроличьих нор - избегайте хитрости и придерживайтесь очевидных четких правил, чтобы каждый мог вернуться домой пораньше. - person Craig Hicks; 14.07.2019
comment
Есть ли разница между поведением var и let в этом случае? - person Kyle; 16.01.2020
comment
@Serge Нет, оба, 1 и undefined предназначены «за» console.log(). 1 - это сгенерированный вывод консоли, а undefined - это возвращаемое значение console.log(), которое всегда возвращает _7 _.— Вы можете проверить это с помощью 5; console.log('6');. - person Robert Siemer; 25.05.2020
comment
@thdoan Установка переменной в undefined технически не отменяет определение переменной. Предположительно OP хотел, чтобы переменная была полностью стерта из существования, и простая установка ее на undefined не делает этого. - person expressjs123; 30.12.2020
comment
@Kyle, этот ответ использует ужас неявных глобальных переменных. Использование только = для определения переменной неявно определит свойство на globalThis (window). Таким образом, ключевое слово delete применимо. - person expressjs123; 30.12.2020
comment
Этот ответ устарел, и такое использование delete устарело. При использовании strict mode это вызовет ошибку . Правильный способ - просто установить для переменной значение null. (Подробнее здесь и этот ответ.) - person ashleedawg; 02.02.2021

Ответ @ scunlife будет работать, но технически это должно быть

delete window.some_var; 

delete должен быть бездействующим, если цель не является свойством объекта. например.,

(function() {
   var foo = 123;
   delete foo; // wont do anything, foo is still 123
   var bar = { foo: 123 };
   delete bar.foo; // foo is gone
}());

Но поскольку глобальные переменные на самом деле являются членами объекта окна, это работает.

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

function Foo() {}
Foo.prototype = { bar: 123 };
var foo = new Foo();
// foo.bar is 123
foo.bar = 456;
// foo.bar is now 456
delete foo.bar;
// foo.bar is 123 again.

Так что будь осторожен.

РЕДАКТИРОВАТЬ: Мой ответ несколько неточен (см. «Заблуждения» в конце). Ссылка объясняет все кровавые подробности, но в итоге могут быть большие различия между браузерами и в зависимости от объекта, из которого вы удаляете. delete object.someProp обычно должен быть безопасным, пока object !== window. Я по-прежнему не стал бы использовать его для удаления переменных, объявленных с помощью var, хотя вы можете это сделать при определенных обстоятельствах.

person noah    schedule 20.10.2009
comment
спасибо @jedierikb за ссылку на эту интересную статью. более конкретно к этой части ‹perfectionkills.com/understanding-delete/#misconceptions ›этого Статья, в которой автор заявляет, что заявление Ноя об удалении должно быть запретной операцией, довольно неточна вместе с прекрасным объяснением, почему это неточно. (Не стреляйте в посыльного!) - person Rob Wells; 09.07.2012
comment
Что касается последнего предложения измененного ответа, единственное обстоятельство, при котором вы можете удалить переменные, объявленные с помощью var, - это когда переменная была объявлена ​​с помощью eval. - person Stephen Booher; 05.10.2012
comment
В этом случае оператор удаления вообще ничего не делает. Что тут происходит? - person Anderson Green; 10.06.2013
comment
@ AndersonGreen - декалированные глобальные переменные создаются с флагом DontDelete, поэтому их нельзя удалить. Этот код ведет себя именно так, как ожидалось. - person RobG; 30.04.2014
comment
Этот ответ устарел, и такое использование delete устарело. (См. здесь и этот ответ.) - person ashleedawg; 02.02.2021
comment
Я думаю, здесь есть разные ответы в зависимости от того, что вы пытаетесь сделать. Да, в современном строгом режиме JS, если вы установите неквалифицированную переменную в значение null, ее можно будет собрать сборщиком мусора. Однако, если вы хотите полностью удалить ссылку, лучше всего удалить ее. Как заметил Ноа, вы всегда хотели бы использовать полностью квалифицированный delete window.propToRemove, если он был неквалифицированным. - person scunliffe; 02.02.2021

Если вы неявно объявляете переменную без var, правильным способом будет использование delete foo.

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

x = 5;
delete x
alert('foo' + x )
// ReferenceError: x is not defined

В некоторых ситуациях может быть безопаснее присвоить ему значение false, null или undefined, чтобы он был объявлен и не выдавал этот тип ошибки.

foo = false

Обратите внимание, что в ECMAScript все null, false, undefined, 0, NaN или '' будут оцениваться как false. Просто убедитесь, что вы не используете оператор !==, а вместо этого != при проверке типов для логических значений, и вам не нужна проверка идентичности (поэтому null будет == false и false == undefined).

Также обратите внимание, что delete не «удаляет» ссылки, а просто свойства непосредственно на объекте, например:

bah = {}, foo = {}; bah.ref = foo;

delete bah.ref;
alert( [bah.ref, foo ] )
// ,[object Object] (it deleted the property but not the reference to the other object)

Если вы объявили переменную с var, вы не можете ее удалить:

(function() {
    var x = 5;
    alert(delete x)
    // false
})();

В Rhino:

js> var x
js> delete x
false

Вы также не можете удалить некоторые предопределенные свойства, такие как Math.PI:

js> delete Math.PI
false

В delete, как и в любом другом языке, есть некоторые странные исключения, если вы достаточно внимательны, вам следует прочитать:

person meder omuraliev    schedule 20.10.2009
comment
Спасибо за полный ответ со всеми подробностями. Я отметил это для этого, но я принял ответ Ноя, потому что считаю, что для простого вопроса краткость важнее завершения. Еще раз - спасибо за отличную работу, которую вы проделали над этим ответом. - person Guss; 22.10.2009

Отредактировано обновлено, чтобы прояснить различные варианты (в зависимости от ваших желаемых намерений)

См. Ответ @noah для получения полной информации.

//Option A.) set to null
some_var = null;

//Option B.) set to undefined
some_var = undefined;

//Option C.) remove/delete the variable reference
delete obj.some_var
//if your variable was defined as a global, you'll need to
//qualify the reference with 'window'
delete window.some_var;

Использованная литература:

API удаления MDN

MDN SyntaxError при удалении неквалифицированного имени переменной в строгом синтаксисе режим

person scunliffe    schedule 20.10.2009
comment
Это не работает, если область действия этого кода - функция. См. Ответ @noah для правильного решения. - person Roatin Marth; 21.10.2009
comment
Спасибо за ответ, но я принял ответ Ноя, потому что он лучше объясняет подводные камни delete. - person Guss; 22.10.2009
comment
не беспокойтесь ... Я дал быстрый и грязный простой ответ - @noah добавил все детали для других случаев, поэтому он тоже заслуживает похвалы. ;-) - person scunliffe; 22.10.2009
comment
Это не так. delete работает только для собственности. При установке null переменная все еще существует. - person Derek 朕會功夫; 23.06.2012
comment
Этот ответ достаточно хорош для наиболее вероятного случая, когда вы проверяете if (some_var) {..} - person BearCode; 19.02.2013
comment
В java / js, если вы сделаете some_var = null сборщик мусора, освободит память для этой переменной - person fider; 26.06.2013
comment
обратите внимание, что perfectionkills.com/understanding-delete/#misconceptions утверждает, что это неверно - person test30; 02.09.2014
comment
Такое использование delete устарело. (См. здесь, а также этот ответ.) - person ashleedawg; 02.02.2021

TL; DR: простые определенные переменные (без var, let, const) могут быть удалены с помощью delete. Если вы используете var, let, const - их нельзя было удалить ни с помощью delete, ни с Reflect.deleteProperty.

Chrome 55:

simpleVar = "1";
"1"
delete simpleVar;
true
simpleVar;
VM439:1 Uncaught ReferenceError: simpleVar is not defined
    at <anonymous>:1:1
(anonymous) @ VM439:1
var varVar = "1";
undefined
delete varVar;
false
varVar;
"1"
let letVar = "1";
undefined
delete letVar;
true
letVar;
"1"
const constVar="1";
undefined
delete constVar;
true
constVar;
"1"
Reflect.deleteProperty (window, "constVar");
true
constVar;
"1"
Reflect.deleteProperty (window, "varVar");
false
varVar;
"1"
Reflect.deleteProperty (window, "letVar");
true
letVar;
"1"

FF Nightly 53.0a1 показывает такое же поведение.

person Serj.by    schedule 05.01.2017
comment
Ваш ответ технически правильный, поэтому вы получаете точку, но все, что вы написали, покрывается выбранным ответом с гораздо более подробной информацией и ссылками на спецификации ECMAScript - в будущем было бы полезно просмотреть существующий ответ перед публикацией. - person Guss; 05.01.2017
comment
Согласовано. Но там упоминается только var случай. Мне также было интересно протестировать и поделиться let и const кейсами. Тем не менее, спасибо за примечание. В следующий раз постараюсь уточнить. - person Serj.by; 06.01.2017

ECMAScript 2015 предлагает Reflect API. Свойство объекта можно удалить с помощью Reflect.deleteProperty ():

Reflect.deleteProperty(myObject, 'myProp');
// it is equivalent to:
delete myObject.myProp;
delete myObject['myProp'];

Чтобы удалить свойство глобального объекта window:

Reflect.deleteProperty(window, 'some_var');

В некоторых случаях свойства нельзя удалить (если свойство не настраивается), и тогда эта функция возвращает false (а также оператор удаления). В остальных случаях возвращает true:

Object.defineProperty(window, 'some_var', {
    configurable: false,
    writable: true,
    enumerable: true,
    value: 'some_val'
});

var frozen = Object.freeze({ myProperty: 'myValue' });
var regular = { myProperty: 'myValue' };
var blank = {};

console.log(Reflect.deleteProperty(window, 'some_var')); // false
console.log(window.some_var); // some_var

console.log(Reflect.deleteProperty(frozen, 'myProperty')); // false
console.log(frozen.myProperty); // myValue

console.log(Reflect.deleteProperty(regular, 'myProperty')); // true
console.log(regular.myProperty); // undefined

console.log(Reflect.deleteProperty(blank, 'notExistingProperty')); // true
console.log(blank.notExistingProperty); // undefined

Есть разница между функцией deleteProperty и оператором delete при запуске в строгом режиме:

'use strict'

var frozen = Object.freeze({ myProperty: 'myValue' });

Reflect.deleteProperty(frozen, 'myProperty'); // false
delete frozen.myProperty;
// TypeError: property "myProperty" is non-configurable and can't be deleted
person madox2    schedule 25.01.2016

Переменные, в отличие от простых свойств, имеют атрибут [[Configurable]], что означает невозможность удаления переменной с помощью оператора delete. Однако есть один контекст выполнения, на который это правило не влияет. Это контекст eval: там атрибут [[Configurable]] не установлен для переменных.

person Eldiyar Talantbek    schedule 25.01.2017

Оператор удаления удаляет свойство из объекта.

delete object.property
delete object['property']

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

По вопросу вам нужен один из следующих

delete some_var;
delete window.some_var;
delete window['some_var'];
person Swarnendu Paul    schedule 14.12.2015
comment
Часть того, что делает delete на самом деле, верна, но предлагаемое решение не является правильным методом. (См. здесь, а также этот ответ.) - person ashleedawg; 02.02.2021

⚠️ Принятый (и другие) ответ устарел!

TL;DR

  • delete не не удалить переменные.
    (Только для удаления свойства из объекта.)

  • Правильный способ отключить - просто установить для переменной значение null. (источник)
    (Это позволяет автоматическим процессам JavaScript удалять переменную из памяти.)

Пример:

x = null;

????


Подробнее:

Использование оператора delete для переменной запрещено устарело с 2012 года, когда все браузеры реализовали (автоматически) пометить и очистить сборщик мусора. Процесс работает, автоматически определяя, когда объекты / переменные становятся недоступными (решая, остается ли код еще требует их).

С помощью JavaScript во всех современных браузерах:

  • Сборка мусора выполняется автоматически. Мы не можем заставить или предотвратить это.
  • Объекты сохраняются в памяти, пока они достижимы.
  • Быть ссылкой - не то же самое, что быть достижимым: пакет взаимосвязанных объектов может стать недостижимым в целом. (исходный код)

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

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

При использовании строгого режима ('use strict';, в отличие от обычного / sloppy mode) попытка удалить переменную приведет к ошибке и не допускается. Обычные переменные в JavaScript нельзя удалить с помощью оператора delete (source) (или любым другим способом, начиная с 2021 года).

 


 

... увы, единственное решение:

Освобождение содержимого переменной

Чтобы освободить содержимое переменной, вы можете просто установить для нее значение null:

var x;

// ...

x = null;    // (x can now be garbage collected)

(источник)


Дальнейшее чтение:

person ashleedawg    schedule 02.02.2021
comment
Умм ... На самом деле null - допустимое значение - если установка переменной в null приведет к ее исчезновению (т.е. заставит будущие ссылки выбрасывать ReferenceError: x is not defined), тогда много программного обеспечения сломается. Если бы вы сказали установить его на undefined, нам, возможно, было бы что обсудить. - person Guss; 02.02.2021
comment
Кроме того, исходный вопрос был о глобальной переменной, которая, как правильно описывает принятый ответ, является либо переменной с ограниченным объемом, и в этом случае ее нельзя удалить (нет, установка ее на null не удаляет ее), либо это свойство глобального объекта, и в этом случае delete просто удалит его. - person Guss; 02.02.2021
comment
Прочитав все еще раз, я думаю, что проблема, с которой я столкнулся с вашим ответом, заключается в том, что в основном речь идет о том, как виртуальная машина Javascript управляет памятью, и она имеет дело (вероятно, довольно хорошо) с тем, как можно освободить память, потребляемую значением, хранящимся в Javascript. К сожалению, OP не связан с управлением памятью как таковым, а скорее о том, чтобы заставить другой код Javascript не видеть, что переменная (фактически, глобальное свойство объекта) была определена. Это не столько фактическое использование памяти, сколько метаданные объекта. - person Guss; 02.02.2021

Вы не можете удалить переменную, если вы объявили ее (с var x;) во время первого использования. Однако, если ваша переменная x впервые появилась в скрипте без объявления, вы можете использовать оператор delete (delete x;), и ваша переменная будет удалена, что очень похоже на удаление элемента массива или удаление свойства объекта.

person Satyapriya Mishra    schedule 31.03.2016
comment
Я думаю, что важное различие здесь (которое я упустил, когда впервые задал вопрос) заключается в том, что не объявленная переменная не является переменной - это свойство объекта. delete используется для того, чтобы объекты забыли об определенных свойствах, это не влияет на переменные. - person Guss; 02.02.2021

Обратите внимание, что delete возвращает true, когда он был успешным.

Обновление 2021: протестировано в Chrome 88 и Firefox 84:

implicit_global = 1;
delete implicit_global; // true

window.explicit_global = 1;
delete explicit_global; // true

const _object = {property: 1};
delete _object.property; // true

function_set = function() {};
delete function_set; // true

function function_declaration() {};
delete function_declaration; // false

(function () {
    var _var = 1;
    console.log(delete _var); // false
    console.log(_var); // 1
})()

(function () {
    let _let = 1;
    console.log(delete _let); // false
    console.log(_let); // 1
})()

(function () {
    const _const = 1;
    console.log(delete _const); // false
    console.log(_const); // 1
})()

Исходный ответ больше не актуален. протестировано в 2015 году на Chrome 52:

implicit_global = 1;
window.explicit_global = 1;
function_set = function() {};
function function_dec() { };
var declared_variable = 1;

delete implicit_global; // true, tested on Chrome 52
delete window.explicit_global; // true, tested on Chrome 52
delete function_set; // true, tested on Chrome 52
delete function_dec; // true, tested on Chrome 52
delete declared_variable; // true, tested on Chrome 52
person oriadam    schedule 23.11.2015
comment
Это не всегда правильно. Особенно в Хроме. Firefox все возвращает правильно. Не тестировал ни в каких других браузерах. Что касается let vars и const vars, он возвращает true, что должно означать, что переменная удалена, но это не так. Вы можете проверить это как в Chrome, так и в FF. Кажется, что FF возвращает правильные значения, а Chrome - нет. Так что не уверен, что действительно можешь на это положиться. Посмотрим: let letVar = "1"; undefined delete letVar; true letVar "1" typeof letVar; "string" const constVar="1"; undefined delete constVar; true constVar; "1" typeof constVar; "string" - person Serj.by; 09.01.2017
comment
Как упоминалось ниже jedierikb, есть отличная статья kangax perfectionkills.com/understanding-delete, которая в основном описывает, почему и как работает оператор delete. Но это не описание того, почему буквально противоположная ситуация с функциями. Как жаль. Однако с переменными все становится намного яснее. - person Serj.by; 09.01.2017
comment
исходный ответ был протестирован в 2015 году на Chrome 52. В Chrome 88 теперь другое поведение, поэтому я обновил ответ. также протестирован на Firefox 84 - поведение идентично Chrome 88. - person oriadam; 02.02.2021

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

Просто обнулите переменную, а затем явно проверьте, является ли она нулевой или нет. Зачем беспокоиться об удалении переменной из области видимости? Какой цели это служит тому, что обнуление не может?

foo = null;
if(foo === null) or if(foo !== null)
person designdrumm    schedule 13.04.2019
comment
Требование состоит в том, чтобы сценарий заказа, который не находится под моим контролем, не видел, что переменная существует - особенно для случая OP, целевой сценарий имеет поведение для значения null, которое я не хочу запускать. - person Guss; 13.04.2019
comment
Во время создания этого вопроса никто не злоупотреблял серверной частью. Это всего лишь пара сценариев на веб-сайте, где я ничего не контролирую, кроме этого сценария. - person Guss; 15.04.2019
comment
Оба сценария находятся в одном документе или в разных документах, которые один вызывает другой для загрузки? Вы упомянули скрипт заказа и целевой скрипт. Если речь идет о передаче переменной другому сценарию через переменную get / post, я бы удалил ее на бэкэнде, прежде чем какой-либо javascript получит ее. Примером этого в php может быть что-то вроде. <?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?> - person designdrumm; 15.04.2019
comment
Понятно. Что ж, если есть проверки и противовесы для null, тогда установка его на значение, с которым целевой сценарий ничего не будет делать, кажется более логичным, чем удаление переменной из области видимости, но вы надеетесь получить свой ответ, поэтому я позволю лошади полежать. Спасибо за ответы. - person designdrumm; 15.04.2019
comment
Один быстрый вопрос. Будет ли когда-нибудь вызван сценарий после вашего, который не будет находиться под вашим контролем, но по-прежнему будет нуждаться в этой переменной? Если это так, то удаление переменной из области видимости - плохая идея. - person designdrumm; 15.04.2019
comment
Ответ на этот вопрос содержится в исходном посте. - person Guss; 15.04.2019
comment
Разве удаление переменной не ускоряет программу в каком-то смысле? Особенно, если переменная содержит что-то вроде URI данных для pdf. - person expressjs123; 30.12.2020
comment
@ expressjs123 - кроме нехватки памяти, совсем нет. Если значение очень большое, то установка для него любого небольшого значения снизит нагрузку на память (undefined хорошо, потому что это разрешение по умолчанию для любого неопределенного свойства, но подойдет любое маленькое значение, например 0 или ""). При этом, если вы не говорите о размере гигабайт, это вряд ли окажет заметный эффект. - person Guss; 02.02.2021