声明和未声明变量的影响

2023-12-26

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属性(如下所述)。在常规使用中,它们的行为应该相同。

两者都存在于全局对象中

下面是一些比较declared and 未申报的全局变量。

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)

Both declared and 未申报的全局变量是window对象(默认全局对象)。两者都不是通过原型链从不同的对象继承的。它们都直接存在于window对象(因为window.hasOwnProperty https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty回报true对彼此而言)。

可配置属性

For declared全局变量,configurable属性是false. For 未申报的全局变量,它是true。的价值configurable可以使用以下方法检索属性getOwnPropertyDescriptor https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor方法,如下图。

var declared = 1;
undeclared = 1;

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

If the configurable属性的属性为 true 时,可以使用以下命令更改属性的属性defineProperty https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty方法,并且可以使用以下方法删除该属性delete https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete操作员。否则,无法更改属性,也无法以这种方式删除属性。

In 非严格模式 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode, the delete运算符返回true如果该属性是可配置的,并返回false如果它是不可配置的。

Summary

声明的全局变量

  • 是默认全局对象的属性(window)
  • 属性属性cannot被改变。
  • Cannot可以使用删除delete操作员

未声明的全局变量

  • 是默认全局对象的属性(window)
  • 属性属性can被改变。
  • Can可以使用删除delete操作员

See also

  • 删除操作符 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete
  • 对象.defineProperty https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty
  • Object.getOwnPropertyDescriptor https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor
  • 拥有自己的财产 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/hasOwnProperty
  • 严格模式 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明和未声明变量的影响 的相关文章

随机推荐