博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
属性为何不能delete掉?
阅读量:5926 次
发布时间:2019-06-19

本文共 1449 字,大约阅读时间需要 4 分钟。

之前看书的时候,看到通过var声明的全局变量不可以通过delete操作符删除。

然后,why?

How can I remember that?

so,I found some words;

 

首先,要了解window对象

window对象是BOM的核心。

那何为BOM?

   bom,全称浏览器对象模型。他是操纵浏览器对象的,所以它提供了很多对象,用来访问浏览器的功能。查看高级程序设计的目录,BOM的二级目录有下面几个:

  window对象,location对象,navigator对象,screen对象,history对象。

window对象就是我们的全局作用域,任何在全局作用域声明的变量和函数,都会变成window对象的属性和方法。

  我们平时写的function 声明,也是同样建立window对象下:

  

var age = 10;    function sayAge(){        alert(this.age)        console.log(this)     }    window.age // 10    sayAge()   // 10

 使用var 声明的全局变量无法用delete操作符删除。 通过var声明的变量和通过function声明的函数拥有DontDelete特性,无法被删除。

全局或者函数代码中的变量和函数声明总是创建带有 DontDelete 特性的属性。

  上面这句注意这几点:

  •  在全局作用域或者函数代码通过var或者function声明的,无法用delete删除,也就是带有名为[[Configurable]]的特性。参考高级程序设计P194;
  • 单纯的eval中声明的变量或函数,可以删除
  • 如果是在eval里面的函数中声明的,不可以删除。参考第一条,第一条的优先级最高。
    优先级:全局作用域/函数代码 > eval 。归根结底,就是第一条,在全局作用域或者函数代码中通过var或者function声明的,无法用delete删除。

      

 


 

 

 

 

 delete是普通运算符,会返回true或false。

  规则为:当被delete的对象的属性存在并且拥有DontDelete时 返回false,否则返回true。

      if(属性存在 &&  拥有DontDelete)  return true;

  else  return false;

   这里的一个特点就是,对象属性不存在时也返回true,所以返回值并非完全等同于删除成功与否。

  所以,不要单纯的相信宿主对象对你造作的返回结果。

 

摘自:

下面是对于 JavaScript 中 delete 操作是如何工作的简短的总结:

  • 变量和函数声明都是活化对象(Activation Object) 或全局对象(Global Object)的属性
  • 属性拥有内部属性,其中 DontDelete 这个内部属性负责确定一个属性是否能够被删除
  • 全局或者函数代码中的变量和函数声明总是创建带有 DontDelete 特性的属性
  • 函数参数总是活动对象的属性, 并且带有 DontDelete
  • 在 Eval 代码中声明的变量和函数总是创建不带 DontDelete 特性 的属性
  • 新的未声明的属性在生成时带空的内部属性,因此也不带 DontDelete 特性
  • 永远不要相信宿主对象对 delete 操作做出的反应

 

转载于:https://www.cnblogs.com/nostic/p/5883774.html

你可能感兴趣的文章
ORACLE 商友ERP
查看>>
windows平台搭建企业wiki-confluence
查看>>
lvs fullnat部署手册(二)keepalived配置篇
查看>>
JavaScript 图片自适应 和 get参数提取
查看>>
解决使用Jackson的@JsonFormat注解出现时间错误情况
查看>>
查看/修改Linux时区和时间
查看>>
canvas-1描线&矩形
查看>>
探寻安全管理平台(SOC)项目的关键成功因素(续二)
查看>>
关于Java中的被动引用
查看>>
每天一个linux命令(4):mkdir命令
查看>>
mysql中的截图字符串函数
查看>>
关于请求a标签跳转显示ID问题解决
查看>>
SCCM2012系列之四,SCCM2012部署前的SQL Server准备
查看>>
自定义自增序列
查看>>
Git 分支管理策略
查看>>
mysql5.6升级到mysql5.7
查看>>
多线程-------GCD
查看>>
沫沫金 - jQuery序列化form表单【支持ajax提交form对象表单entity.xxx】
查看>>
iis使用nginx实现网站负载(转)
查看>>
RHCS双机集群调测
查看>>