Program Tip

JavaScript 변수를 설정 해제하는 방법은 무엇입니까?

programtip 2020. 10. 3. 11:32
반응형

JavaScript 변수를 설정 해제하는 방법은 무엇입니까?


window이미 이전 스크립트로 채워진 JavaScript에 전역 변수 (실제로는 속성이지만 중요하지 않다고 생각합니다)가 있지만 나중에 실행될 다른 스크립트가 그 값을 보거나 심지어 한정된.

나는 some_var = undefined테스트 목적으로 작동 typeof some_var == "undefined"하지만 실제로 그것에 대해 올바른 방법이라고 생각하지 않습니다.

어떻게 생각해?


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_aECMAScript 사양에서 " VariableEnvironment "라고 부르는 참조 가 생성됩니다 . 함수 var내부에서 사용하는 경우 함수 실행 컨텍스트 일 수 있습니다 (조금 더 복잡해질 수 있음). 고려할 때 let) 또는 "전역"코드의 경우 VariableEnvironment 가 전역 객체에 연결됩니다 (종종 window).

언급 VariableEnvironment은 에 설명 된 과정 - 일반적으로 삭제 가능한 없습니다 ECMAScript를 10.5 자세하게 설명하지만 코드가 실행되지 않는 말을 충분 eval(대부분의 브라우저 기반의 개발 콘솔이 사용하는) 상황, 다음 변수로 선언 var할 수 없습니다 삭제됩니다.

2. 사용하지 않고 var

var키워드 를 사용하지 않고 이름에 값을 할당하려고 할 때 Javascript는 ECMAScript 사양에서 " LexicalEnvironment "라고 부르는 참조에서 명명 된 참조를 찾으려고 시도 하며 주요 차이점은 LexicalEvironment 가 중첩된다는 것입니다. 즉 LexicalEnvironment 에는 부모가 있습니다 ( 무엇 인 ECMAScript 사양 통화 "외부 환경 참조")와에 javscript가에 대한 참조를 찾는 데 실패하면 LexicalEenvironment , 그것은 부모에 보이는 LexicalEnvironment 에 설명 된대로 ( 10.3.110.2.2.1 ). 최상위 LexicalEnvironment 는 " 글로벌 환경입니다.", 이는 참조가 전역 객체의 속성이라는 점에서 전역 객체에 바인딩되어 있습니다. 따라서 var현재 범위 또는 외부 범위에서 키워드를 사용하여 선언되지 않은 이름에 액세스하려고하면 Javascript는 결국 속성을 가져옵니다. 의 window객체가 참조 역할을합니다. 우리가 전에 배운대로, 개체의 속성은 삭제 될 수 있습니다.

메모

  1. var선언은 "게재" 된다는 점을 기억하는 것이 중요합니다. 즉, var선언문 에서 수행 할 수있는 값 초기화는 아니지만 항상 해당 범위의 시작 부분에서 발생한 것으로 간주됩니다. . 따라서 다음 코드 에서 속성이 아닌 VariableEnvironmenta 의 참조 이며 해당 값은 코드의 끝에 있습니다.window10

    function test() { a = 5; var a = 10; }

  2. 위의 설명은 "엄격 모드"가 활성화되지 않은 경우입니다. "엄격 모드"를 사용하는 경우 조회 규칙이 약간 다르며 "엄격 모드"없이 창 속성으로 확인 된 어휘 참조는 "엄격 모드"에서 "선언되지 않은 변수"오류를 발생시킵니다. 나는 이것이 어디에 지정되어 있는지 실제로 이해하지 못했지만 브라우저가 어떻게 작동하는지 이해했습니다.


@scunlife의 대답은 작동하지만 기술적으로는

delete window.some_var; 

대상이 개체 속성이 아닌 경우 삭제는 작동하지 않는 것으로 간주됩니다. 예 :

(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올바른 상황에서 할 수 있지만 선언 된 변수를 삭제하는 데 여전히 사용하지 않습니다 .


var를 사용 하지 않고 변수를 암시 적으로 선언하는 경우 적절한 방법은를 사용하는 것 delete foo입니다.

그러나이를 삭제 한 후 추가와 같은 작업에서 이것을 사용하려고 ReferenceError하면 선언되지 않은 정의되지 않은 식별자에 문자열을 추가 할 수 없기 때문에 a 가 발생합니다. 예:

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

It may be safer in some situations to assign it to false, null, or undefined so it's declared and won't throw this type of error.

foo = false

Note that in ECMAScript null, false, undefined, 0, NaN, or '' would all evaluate to false. Just make sure you dont use the !== operator but instead != when type checking for booleans and you don't want identity checking (so null would == false and false == undefined).

Also note that delete doesn't "delete" references but just properties directly on the object, e.g.:

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)

If you have declared a variable with var you can't delete it:

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

In Rhino:

js> var x
js> delete x
false

Nor can you delete some predefined properties like Math.PI:

js> delete Math.PI
false

There are some odd exceptions to delete as with any language, if you care enough you should read:


some_var = null;

//or remove it..
delete some_var;

TLDR: simple defined variables (without var, let, const) could be deleted with delete. If you use var, let, const - they could not be deleted neither with delete nor with 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 shows same behaviour.


ECMAScript 2015 offers Reflect API. It is possible to delete object property with Reflect.deleteProperty():

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

To delete property of global window object:

Reflect.deleteProperty(window, 'some_var');

In some cases properties cannot be deleted (when the property is not configurable) and then this function returns false (as well as delete operator). In other cases returns 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

There is a difference between deleteProperty function and delete operator when run in strict mode:

'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

The delete operator removes a property from an object.

delete object.property
delete object['property']

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

According to the question you need one of followings

delete some_var;
delete window.some_var;
delete window['some_var'];

In addition to what everyone had written, also note that delete returns boolean. It can tell you if the delete was successful or not.

UPDATE:

Testing on latest Chrome, everything was deleltable. delete function returned true for all of the following methods, and actually removed them:

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

delete 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

Variables, in contrast with simple properties, have attribute [[Configurable]], meaning impossibility to remove a variable via the delete operator. However there is one execution context on which this rule does not affect. It is the eval context: there [[Configurable]] attribute is not set for variables.


You cannot delete a variable if you declared it (with var x;) at the time of first use. However, if your variable x first appeared in the script without a declaration, then you can use the delete operator (delete x;) and your variable will be deleted, very similar to deleting an element of an array or deleting a property of an object.


I am bit confused. If all you are wanting is for a variables value to not pass to another script then there is no need to delete the variable from the scope. Simply nullify the variable then explicit check if it is or is not null. Why go through the trouble of deleting the variable from scope? What purpose does this server that nullifying can not?

foo = null;
if(foo === null) or if(foo !== null)

참고URL : https://stackoverflow.com/questions/1596782/how-to-unset-a-javascript-variable

반응형