美文网首页程序员
由delete Function.length引发的一些思考

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

作者: purple_force | 来源:发表于2017-02-17 12:13 被阅读0次

    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);
    

    运行结果如下:

    结果1.png

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

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

    结果如下:

    结果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与普通函数没有区别,都是访问自身的属性:

    结果4.png

    delete Function.length:

    终于到正题了,上图:

    结果5.png

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

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

    结果6.png

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

    相关文章

      网友评论

        本文标题:由delete Function.length引发的一些思考

        本文链接:https://www.haomeiwen.com/subject/cwnhwttx.html