gpt4 book ai didi

javascript - 声明和未声明变量的影响

转载 作者:行者123 更新时间:2023-12-01 17:43:26 24 4
gpt4 key购买 nike

JavaScript 声明变量和未声明变量之间的主要区别是什么,因为删除运算符对声明的变量不起作用?

 var y = 43;     // declares a new variable
x = 42;

delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)

为什么会发生这种情况?全局声明的变量也是window对象的属性,为什么不能删除呢?

最佳答案

声明和未声明的全局变量

存储和访问它们的机制是相同的,但 JavaScript 在某些情况下根据 configurable 属性的值(如下所述)对它们进行不同的处理。在常规使用中,它们的行为应该相同。

两者都存在于全局对象中

下面是一些已声明未声明全局变量的比较。

var declared = 1;  // Explicit global variable (new variable)
undeclared = 1; // Implicit global variable (property of default global object)

window.hasOwnProperty('declared') // true
window.hasOwnProperty('undeclared') // true

window.propertyIsEnumerable('declared') // true
window.propertyIsEnumerable('undeclared') // true

window.declared // 1
window.undeclared // 1

window.declared = 2;
window.undeclared = 2;

declared // 2
undeclared // 2

delete declared // false
delete undeclared // true
delete undeclared // true (same result if delete it again)

delete window.declared // false
delete window.undeclared // true (same result if delete it yet again)
delete window.undeclared // true (still true)

声明的全局变量和未声明的全局变量都是 window 对象(默认全局对象)的属性。两者都不是通过原型(prototype)链从不同的对象继承的。它们都直接存在于 window 对象中(因为 window.hasOwnProperty 都返回 true)。

可配置属性

对于声明的全局变量,可配置属性为false。对于未声明全局变量,它是true。可以使用 getOwnPropertyDescriptor 检索configurable 属性的值。方法,如下图。

var declared = 1;
undeclared = 1;

(Object.getOwnPropertyDescriptor(window, 'declared')).configurable // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable // true

如果属性的可配置属性为true,则可以使用defineProperty更改该属性的属性。方法,并且可以使用 delete 删除该属性运算符(operator)。否则,无法更改属性,也无法删除属性。

non-strict mode ,如果属性可配置,则 delete 运算符返回 true;如果属性不可配置,则返回 false

摘要

声明的全局变量

  • 是默认全局对象 (window) 的属性
  • 属性无法更改。
  • 无法使用delete运算符删除

未声明的全局变量

  • 是默认全局对象 (window) 的属性
  • 属性可以更改。
  • 可以使用delete运算符删除

另请参阅

关于javascript - 声明和未声明变量的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15985875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com