国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > web前端 > jscript > 理解delete:javascript中的一些细节

理解delete:javascript中的一些细节

来源:程序员人生   发布时间:2014-04-27 12:19:11 阅读次数:2439次

在javascript中,我们有时候要使用delete删除对象。但是,对于delete的一些细节我们未必尽知。昨天,看到kangax分析delete的文章,获益匪浅。本文将文章的精华部分翻译出来,与各位分享。

  1. 原理
    1. 代码类型
    2. 执行上下文
    3. 激活对象/可变对象
    4. 属性特性
    5. 内置对象和DontDelete
    6. 未声明的赋值
  2. Firebug 困惑
    1. 通过eval删除变量
  3. 浏览器兼容性
    1. Gecko DontDelete bug
  4. IE bugs
  5. 误区
  6. ‘delete’和宿主对象
  7. ES5严格模式
  8. 总结

原理

为什么我们能删除一个对象的属性?

var o = { x: 1 };
delete o.x;
// true
o.x; // undefined

但是,像这样声明的变量则不行:

var x = 1;
delete x;
// false
x; // 1

或者如此声明的函数:

function x(){}
delete x;
// false
typeof x; // "function"

注意,当一个属性不能被删除时,delete只返回false。

要理解这一点,我们首先需要掌握像变量实例化和属性特性这样的概念--遗憾的是这些在关于javascript的书中很少讲到。我将在接下来的几个段落中试着简明的重温这些概念。 理解它们一点也不难,如果你不在乎它们为什么这么运行,你可以随意的跳过这一章。

代码类型

在ECMAScript中有三种类型的可执行代码:全局代码(Global code)函数代码(Function code)Eval code。这些类型有那么点自我描述,但这里还是作一个简短的概述:

  1. 当一段源代码正文被视为程序时,它在全局作用域中执行,被当成全局代码(Global code)。在一个浏览器环境中,SCRIPT元素中的内容通常被当作程序来解析,因此,它被当作全局代码来评估。
  2. 在一个函数内部直接执行的任何代码,很明显被当作函数代码(Function code)。在浏览器红中事件属性的内容(如:<p onclick="...">)通常被当作函数代码(Function code)来解析;
  3. 最后,提供给内置函数eval()的文本被当作Eval 代码(Eval code)来解析。我们很快会看到这种类型很特殊。
    生活不易,码农辛苦
    如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
    程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生