JavaScript中对象方法双重命名的作用及相关疑问咨询
嘿,这个问题抓得很准,我来给你把这个点讲透~
首先,你看到的这种写法叫做具名函数表达式(不用死记术语,理解本质就行),就是给对象属性里的函数额外加了一个“内部专属名字”,这个名字有两个核心作用:
1. 函数内部的可靠自引用
比如你第一个例子里的代码:
var javascriptObject = { functionName1: function functionName2() { } }
这里的functionName2是这个函数自己的内部名字——它只能在函数体内部被访问到,外部根本拿不到(你在外面试javascriptObject.functionName2会得到undefined)。
这个内部名字最实用的场景是递归调用:如果这个函数需要自己调用自己,用functionName2比用javascriptObject.functionName1更靠谱。比如哪天你把对象的属性名从functionName1改成了foo,只要内部还是用functionName2,递归逻辑完全不受影响,不用跟着改。
2. 访问挂载在函数自身的属性
再看你项目里的这段代码:
init: function init() { init._base.call(this); }
这里的第二个init就是这个函数自己的内部引用。为什么去掉它就跑不起来?因为init._base是直接挂在这个函数对象本身上的属性——也就是说,之前肯定有类似init._base = 某个父类初始化函数的代码,把_base绑定到了这个init函数上。
当你在函数内部写init的时候,它指向的就是这个函数自己,自然能拿到_base属性。但如果去掉第二个init,变成function() { init._base.call(this); },这时候函数内部的init会去全局作用域找,而全局里根本没有这个变量,直接就会抛出“init is not defined”的错误,代码自然崩了。
额外的小福利
还有个隐形好处:在浏览器调试工具里,具名函数表达式会显示你给的内部名字,而不是显示“anonymous function”,调试的时候一眼就能认出这个函数是干啥的,定位问题方便多了~
内容的提问来源于stack exchange,提问作者yrslvrtfmv

