var a = 1; delete a;
返回false
a = 1; delete a;
返回true
请问为什么呢?var a = 1 和 window.a = 1 有什么区别呢?
欢迎选择我的课程,让我们一起见证您的进步~~
翻了《js权威指南》,原理大概是: 对象的属性有4个特性(attributes),其中一个叫configurable,如果这个属性值为false则一定不能被delete。
configurable
false
delete
var x = 1; Object.getOwnPropertyDescriptor(this,'x'); //结果是Object {value: 1, writable: true, enumerable: true, configurable: false}
configurable为false,所以不能删除。
但我还不确定configurable为true是否一定能删除,待补充。
true
delete扩展资料
那么问题来了,eval 定义的 global var 返回 false 吗?
eval('var a = 1'); delete a;
//全局变量 var a = 1; delete a; //隐式全局变量 a = 1; delete a;
隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力 通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的 无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的
这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的
其实这种问题,你google一下完全可以找到答案,例如这篇就讲的很不错,完全可以解释你的疑惑:http://blog.charlee.li/javascript-variables-and-delete-operator/
delete操作符通常用来删除对象的属性,而不是一般的变量或者函数。
补充一点在ES5严格模式下,未定义的变量直接赋值将会报错,隐式全局变量将不再存在了
翻了《js权威指南》,原理大概是:
对象的属性有4个特性(attributes),其中一个叫
configurable
,如果这个属性值为false
则一定不能被delete
。configurable
为false
,所以不能删除。但我还不确定
configurable
为true
是否一定能删除,待补充。delete扩展资料
那么问题来了,eval 定义的 global var 返回 false 吗?
//全局变量
var a = 1;
delete a;
//隐式全局变量
a = 1;
delete a;
隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力
通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的
无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的
这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的
其实这种问题,你google一下完全可以找到答案,例如这篇就讲的很不错,完全可以解释你的疑惑:
http://blog.charlee.li/javascript-variables-and-delete-operator/
delete
操作符通常用来删除对象的属性,而不是一般的变量或者函数。补充一点在ES5严格模式下,未定义的变量直接赋值将会报错,隐式全局变量将不再存在了