从窗口对象中删除属性时的奇怪行为

用户名
function foobar() {}

console.log(typeof window.foobar); // "function"
console.log(typeof window.alert); // "function"

delete window.foobar;
delete window.alert;

console.log(typeof window.foobar); // "function"
console.log(typeof window.alert); // "undefined"

console.log(window.hasOwnProperty('foobar')); // true
console.log(window.hasOwnProperty('alert')); // false

有人可以解释一下,这怎么可能?

为什么不能简单地删除foobarwindow对象属性?

为什么像foobar操作程序这样的自定义全局函数受到保护,而delete操作程序却没有这样的内置全局函数alert

i

全局变量不可配置:

Object.getOwnPropertyDescriptor(window, 'foobar').configurable; // false

这是因为根据静态语义:TopLevelVarDeclaredNames,函数声明就像var声明:

在函数或脚本的顶层,内部函数声明被视为var声明。

运行时语义:GlobalDeclarationInstantiation则将它们声明为不可配置的:

  1. 对于每一个生产˚FfunctionsToInitialize,做
    1. statusenvRecCreateGlobalFunctionBindingfnfofalse)。

CreateGlobalFunctionBinding(N,V,D)使用参数false作为属性的可配置性:

    1. desc为PropertyDescriptor {[[Value]]:V,[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:D }。

因此,操作员使用[[Delete]]内部方法不会成功:delete

  1. 如果desc。[[Configurable]]为true,则

    1. O中删除名称为P的自有属性
    2. 返回true
  2. 返回false

这就是为什么您应该使用严格模式。否则,某些问题将被忽略。

delete window.foobar; // false (in sloppy mode)
delete window.foobar; // TypeError (in strict mode)

您可以删除本机,alert因为它是可配置的。

HTML规范中将该方法定义为IDL方法:

[Global]
/*sealed*/ interface Window : EventTarget {
  // ...
  void alert(optional DOMString message = "");
};

根据WebIDL的规定,如果公开的操作不是不可伪造的,则它们应该是可配置的

该属性具有属性{[[[Writable]]:B,[[Enumerable]]:true,[[Configurable]]:B },如果操作在接口上不可伪造,则Bfalse否则为true

Object.getOwnPropertyDescriptor(window, 'alert').configurable; // true

如果要删除该函数,请将其分配为属性,而不要使用函数声明:

window.foobar = function() {};
Object.getOwnPropertyDescriptor(window, 'foobar').configurable; // true
delete window.foobar; // true

这是因为通过属性分配创建属性时,它是可配置的。[[Set]]内部方法使用的CreateDataProperty中

  1. newDesc为PropertyDescriptor {[[Value]]:V,[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:true }。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在cython cdef类中创建python属性时的奇怪行为

来自分类Dev

同时执行队列中对象的功能时的奇怪行为

来自分类Dev

htaccess删除空白时的奇怪行为

来自分类Dev

将struct属性(切片)传递给从中删除元素的函数时的奇怪行为

来自分类Dev

缩放对象时非常奇怪的行为

来自分类Dev

缩放对象时的奇怪行为

来自分类Dev

使用另一个线程在WPF中创建新窗口时的奇怪行为

来自分类Dev

Powershell-调用每个对象的函数会更改所有对象中的数组时的奇怪行为

来自分类Dev

从ListView中删除项目的奇怪行为

来自分类Dev

C#是从App.xaml.cs访问WPF主窗口中的Static属性时导致此奇怪行为的原因

来自分类Dev

ApiController中的属性路由奇怪行为

来自分类Dev

href属性中jQuery代码的奇怪行为

来自分类Dev

C#中奇怪的COM对象行为

来自分类Dev

Json对象操作中的Javascript奇怪行为

来自分类Dev

vue.js 在直接 css/样式更改和从数组中删除项目时的奇怪行为

来自分类Dev

覆盖部署为 Tomcat 中的 WAR 的 spring-boot 应用程序的属性时的奇怪行为

来自分类Dev

从python中的列表继承时的奇怪行为

来自分类Dev

返回选项时mapValues中的奇怪行为

来自分类Dev

检查Alloy中的断言时的奇怪行为

来自分类Dev

在LowerCamelCase中命名变量时的奇怪行为

来自分类Dev

从R中的stdin读取时的奇怪行为

来自分类Dev

在viewDidLoad中调用addSubView时的奇怪行为

来自分类Dev

在 Pendrive 中传输文件时的奇怪行为

来自分类Dev

python中使用另一个类对象的列表作为类属性时的奇怪行为

来自分类Dev

奇怪的行为复制对象

来自分类Dev

动态对象的奇怪行为

来自分类Dev

绝对位置时CSS边框属性的奇怪行为

来自分类Dev

在propertyMissing方法内添加属性时出现奇怪的行为

来自分类Dev

绝对位置时CSS边框属性的奇怪行为

Related 相关文章

  1. 1

    在cython cdef类中创建python属性时的奇怪行为

  2. 2

    同时执行队列中对象的功能时的奇怪行为

  3. 3

    htaccess删除空白时的奇怪行为

  4. 4

    将struct属性(切片)传递给从中删除元素的函数时的奇怪行为

  5. 5

    缩放对象时非常奇怪的行为

  6. 6

    缩放对象时的奇怪行为

  7. 7

    使用另一个线程在WPF中创建新窗口时的奇怪行为

  8. 8

    Powershell-调用每个对象的函数会更改所有对象中的数组时的奇怪行为

  9. 9

    从ListView中删除项目的奇怪行为

  10. 10

    C#是从App.xaml.cs访问WPF主窗口中的Static属性时导致此奇怪行为的原因

  11. 11

    ApiController中的属性路由奇怪行为

  12. 12

    href属性中jQuery代码的奇怪行为

  13. 13

    C#中奇怪的COM对象行为

  14. 14

    Json对象操作中的Javascript奇怪行为

  15. 15

    vue.js 在直接 css/样式更改和从数组中删除项目时的奇怪行为

  16. 16

    覆盖部署为 Tomcat 中的 WAR 的 spring-boot 应用程序的属性时的奇怪行为

  17. 17

    从python中的列表继承时的奇怪行为

  18. 18

    返回选项时mapValues中的奇怪行为

  19. 19

    检查Alloy中的断言时的奇怪行为

  20. 20

    在LowerCamelCase中命名变量时的奇怪行为

  21. 21

    从R中的stdin读取时的奇怪行为

  22. 22

    在viewDidLoad中调用addSubView时的奇怪行为

  23. 23

    在 Pendrive 中传输文件时的奇怪行为

  24. 24

    python中使用另一个类对象的列表作为类属性时的奇怪行为

  25. 25

    奇怪的行为复制对象

  26. 26

    动态对象的奇怪行为

  27. 27

    绝对位置时CSS边框属性的奇怪行为

  28. 28

    在propertyMissing方法内添加属性时出现奇怪的行为

  29. 29

    绝对位置时CSS边框属性的奇怪行为

热门标签

归档