search

Home  >  Q&A  >  body text

javascript - js delete 问题?

var a = 1;
delete a;

返回false

 a = 1;
 delete a;

返回true

请问为什么呢?var a = 1 和 window.a = 1 有什么区别呢?

天蓬老师天蓬老师2825 days ago321

reply all(6)I'll reply

  • 黄舟

    黄舟2017-04-10 15:18:39

    翻了《js权威指南》,原理大概是:
    对象的属性有4个特性(attributes),其中一个叫configurable,如果这个属性值为false则一定不能被delete

    var x = 1;
    Object.getOwnPropertyDescriptor(this,'x');
    //结果是Object {value: 1, writable: true, enumerable: true, configurable: false}
    

    configurablefalse,所以不能删除。

    但我还不确定configurabletrue是否一定能删除,待补充。


    delete扩展资料

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:18:39

    那么问题来了,eval 定义的 global var 返回 false 吗?

    eval('var a = 1');
    delete a;
    

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:18:39

    //全局变量
    var a = 1;
    delete a;
    //隐式全局变量
    a = 1;
    delete a;

    隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力
    通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的
    无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的

    这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:18:39

    其实这种问题,你google一下完全可以找到答案,例如这篇就讲的很不错,完全可以解释你的疑惑:
    http://blog.charlee.li/javascript-variables-and-delete-operator/

    reply
    0
  • 阿神

    阿神2017-04-10 15:18:39

    delete操作符通常用来删除对象的属性,而不是一般的变量或者函数。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:18:39

    补充一点在ES5严格模式下,未定义的变量直接赋值将会报错,隐式全局变量将不再存在了

    reply
    0
  • Cancelreply