JavaScript高级程序设计(六):关键字 void 和 delete 使用

一、void  

  1、概述:JavaScript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值。

  2、语法:JavaScript void (express)   或则 JavaScript void express

  3、应用场景

    A、创建了一个超级链接,用户单时会提交表单。

<A HREF="javascript:void(document.form.submit())">单此处提交表单</A>

  B、创建一个死链接:即 a href=#与 a href=javascript:void(0) 的区别 

  “#”包含了一个位置信息,默认的锚是#top 也就是网页的上端。

  而javascript:void(0)   仅仅表示一个死链接

二、delete

  1、概述:delete用于删除对象的属性,不能删除一般的变量和函数。

//删除对象中的属性
var
obj={name:'tz',age:12}; delete obj.age; //true obj.age; 输出: undefined //删除成功

但是不能删除一般变量和函数:

//直接删除变量
var x = 1;   
delete x; // false  删除失败
x; // 1

//删除函数
function t(){alert(2);}
delete t; //false
typeof t; //"function"

//输出:
"function"

 深入的应用delete:

  代码的类型分为:全局代码、函数代码、eval代码

1. 当一段代码被当做程序段运行的时候,它是在全局作用域下执行的,也就是全局代码。在浏览器环境下,通常<SCRIPT>元素就是一段全局代码。

2. 所有在function中声明的代码即是函数代码,最常见的是HTML元素的响应事件(<p onclick="...">)。

3. 传入内建的eval函数中的代码段称为eval代码,稍后我们会看到这种类型的特别性。

在源代码中声明的变量和方法实际上都是作为属性被加入到与当前上下文相关联的这个对象当中 。

每一个变量属性都可以有以下任意多 个属性: ReadOnly, DontEnum, DontDelete, Internal。你可以把这些当做标记,标明了变量属性可以持有的某种特性。这里我们最感兴趣的就是DontDelete标记。

在 声明变量或者函数时,他们都变成了当前上下文对象的属性--对于函数代码来说是活动对象,对于全局代码来说则是变量对象,而值得注意的是这些属性在创建时 都带有DontDelete标记,但是显式或者隐式的赋值语句所产生的属性并不会带有这个标记!

非声明性赋值

你可能知道,非声明性的赋值语句会产生全局变量,进而变成全局变量对象的属性。所以根据上面的解释,非声明性的赋值所产生的对象是可以被删除的:

var GLOBAL_OBJECT = this;  
  
/* 通过声明的全局变量会持有DontDelete,无法被删除。 */  
var foo = 1;  
  
/* 没有经过声明的变量赋值不会带DontDelete,可以被删除。 */  
bar = 2;  
  
delete foo; // false  
typeof foo; // "number"  
  
delete bar; // true  
typeof bar; // "undefined" 

需要注意的是属性标记诸如DontDelete是在这个属性被创建的时候 产生的,之后对该属性的任何赋值都不会改变此属性的标记!

总结

  • 变量和函数的声明实际上都会成为全局对象或者当前函数活动对象的属性。
  • 属性都有一个DontDelete标记,用于表明该属性是否能被delete。
  • 变量和函数的声明创建的属性都会带有DontDelete标记。
  • 函数内建的arguments对象作为该函数活动对象的默认属性,创建时总会带有DontDelete标记。
  • 在eval代码块中声明的变量和方法都不带有DontDelete标记。
  • 对还不存在的变量或属性的直接赋值产生的对象不会带有任何标记,包括DontDelete。
  • 对于宿主对象而言,delete操作的结果有可能是不可预料的。
原文地址:https://www.cnblogs.com/renxiaoren/p/5942243.html