由delete Function.length引发的一些思考

delete:

在JS中,delete操作符用来删除一个对象的属性,其基本用法为:

delete object.property

delete object["property"]

在严格模式中,如果属性是一个不可配置(non-configurable)属性,删除时会抛出异常,非严格模式下返回false,其他情况都返回true

可以使用delete操作符来删除一个隐式声明的全局变量,也就是没有使用var声明的全局变量。全局变量其实是global对象(window)的属性。但是对于使用var声明的变量,则无法通过delete删除。

var a=1;
    b=2;
delete window.a;
delete window.b;
console.log(window.a);
console.log(window.b);

运行结果如下:

由delete Function.length引发的一些思考_第1张图片
结果1.png

对于var声明的全局变量a,并没有删除成功,而隐式声明的全局变量b,删除成功了。通过查看window的属性ab的属性描述符:

var a=1;
    b=2;
console.log(Object.getOwnPropertyDescriptor(window,"a"));
console.log(Object.getOwnPropertyDescriptor(window,"b"));

结果如下:

由delete Function.length引发的一些思考_第2张图片
结果2.png

可以看到,通过var声明的全局变量a,其属性描述configurablefalse,表明其不可通过delete操作符删除。而未通过var声明的全局变量b,其属性描述configurabletrue,表明其可以通过delete操作符删除。

至于,为什么通过var声明和未通过var声明的全局变量的属性描述configurable会有这样的差异,目前不得而知,可能是JS规范中的要求,还请知道的小伙伴告知。

Function.length:

函数length属性表示的是函数的形参个数,不包括 剩余参数,当形参中存在默认值时,只包括第一个有默认值的形参的前面的参数。

为什么此处说函数length属性,而没有说Functionlength属性呢。因为Function构造函数也是函数,因此,Function也是Function的实例:

结果3.png

怎么感觉自己既是自己的老子,又是自己儿子呢,哈哈,开玩笑。

当访问length属性时,Function与普通函数没有区别,都是访问自身的属性:

由delete Function.length引发的一些思考_第3张图片
结果4.png

delete Function.length:

终于到正题了,上图:

由delete Function.length引发的一些思考_第4张图片
结果5.png

看到结果,万千奔腾而过啊,不是删除成功了,他喵的,怎么访问length属性还是访问到了呢,还变成了0

细细想过,不对,此length可能非彼length了,有可能是Function.prototype上的,于是就开始验证:

由delete Function.length引发的一些思考_第5张图片
结果6.png

果不其然,执行delete Function.length后,Function.length访问的其实是Function.prototype.length,待delete Function.prototype.length后,Function.length就访问不到了。

你可能感兴趣的:(由delete Function.length引发的一些思考)