首页 > 代码库 > 函数的name属性

函数的name属性

6月1日开始,回到学校准备毕业设计的答辩工作,刚回来的几天主要是修改论文,为论文查重做准备,偶尔会有小范围的聚会。接着,准备代码验收与论文答辩,中间还穿插着有拍毕业照,准备毕业档案材料以及团体聚会等一系列事情。虽说不像上班那么疲惫,但是每天安排的都很紧凑,没怎么闲着。终于这一切都完事了,就等着最后领毕业证了,也终于有空规划一下自己了。

仔细想了一下,我发现实习的这段时间,自己的知识面有所扩展,也自己看了一些技术方面的书,但是没有写过什么总结,大半年下来,博客和github几乎没有更新。所以在接下来的这段时间要给自己立一个flag,每天要学一些新技术,并将自己看过的一些内容进行梳理,以博客总结的形式展示出来。

今天重新翻开《JavaScript忍者秘籍》看到自己之前看的时候画的各种彩色圈圈、直线、波浪线,想起了刚开始看的时候,看不懂的地方就发呆,然后用笔画圈圈。现在再开起来就没那么费劲了,而且还能边看边思考。

在《JavaScript忍者秘籍》的第三章中有这么一段话:“所有的函数都有一个name属性,改属性保存的是该函数名称的字符串。没有名称的函数也仍然有name属性,只是该属性值为空字符串。”

于是就有如下3种情况:

第1种情况:

    function isNimble(){return false;}
    console.log(isNimble.name);//isNimble

第2种情况:

    var canFly = function(){return true;}
    console.log(canFly.name);//按照书中说的应该输出‘‘,实际输出的为canFly

第3种情况:

    var wieldsSword = function swingsSword(){return true;}
    console.log(wieldsSword.name);//swingSword

问题就出在第二种情况:

《JavaScript忍者秘籍》中表示创建一个匿名函数,并赋值给一个变量,这种情况该函数的name属性值应该为"",而不是变量的名字。

于是google了一下,原来:

ES6对函数的name属性进行了修改,如果将一个匿名函数赋值给一个变量,ES5的name属性会返回空字符串,而ES6的name属性会返回实际的函数名。

另外对于Funtion构造函数返回的函数实例,name属性的值为"anonymous"

    //对于Funtion构造函数返回的函数实例
    console.log((new Funtion).name);//‘anonymous‘

对于bind返回的函数,name属性值会加上‘bound‘前缀:

    //对于bind返回的函数
    function foo(){};
    foo.bind({}).name //‘bound foo‘
    (function(){}).bind({}).name //‘bound‘

 

函数的name属性