libook
2021-04-20 17:01:08 +08:00
在很多编程语言中,“函数”更多指的是一种纯粹的代码语法结构,用于复用代码。
在 JS 中 function 有三种功能:
1. 函数式语法
2. 对象构造函数
3. 对象方法
箭头函数仅具备上述第一条功能,更符合我们广义上对于函数的定义。
当然也可能还有其他奇淫技巧,这里不讨论。
在你的例子里,是希望给一个对象添加新方法,一个方法要想访问对象主体就要用 this 指令,而箭头函数不支持 this,所以箭头函数不能被用作声明方法。这时候你只能用 function 。
你要清楚的是,你的 funciton 是在对象外部声明的,而 this 并不会因为你 user.ff= func 而“跑”到了 user 对象内部,而是依托 function 对 this 的支持,在你调用的时候,顺着 user.ff()这个调用路径向左找到了 user 对象。换言之,你完全可以同时把 func 赋值给多个对象的属性,你调用 user1.ff()的时候它就会去找 user1,当你调用 user2.ff()的时候它就会去找 user2,都能正确输出各自对象的 name 值。
然后由于 JS 是非常灵活的一门语言,所以它并不限制你必须在对象的直接作用域内使用 this,所以你可以在箭头函数里使用 this,只不过这个 this 跟这个箭头函数没关系,就像在一个 for 块或者 if 块内使用 this 一样,它会一层一层向外层作用域找对象:
1. 找到 function 的作用域内的时候,就按照前面说的 function 内 this 找对象的机制找此时这个 function 的调用路径左侧的对象;
2. 找到对象的作用域内的时候,就直接用这个对象;
3. 最终找到对象或者最终到全局对象(globalThis/window/global),然后就用全局对象。
建议深入了解一下原型机制,特别是对象创建的原理,然后对比一下函数和箭头函数的区别。