使用 call()方法调用函数 和 将作用域 this 直接作参数传入有什么区别?

2020-05-30 17:25:09 +08:00
 gromit1337
小程序里的一个封装方法需要调用页面的组件, 要用到 this.selectComponent().doThing() ,这里引起了标题的争议了
2755 次点击
所在节点    JavaScript
21 条回复
gromit1337
2020-05-30 17:35:40 +08:00
感觉用 call 少了个参数,少了些思想负担😂,但是我的后端同事们好像对 es2015 之后的语法都很排斥
liuy1994g
2020-05-30 18:43:02 +08:00
this 和参数还是有些区别的吧
rabbbit
2020-05-30 19:05:28 +08:00
面向对象编程和函数式编程?
ChanKc
2020-05-30 21:41:08 +08:00
没有太看懂
this.selectComponent()和 selectComponent.call(this)的差别?
在你的情况下似乎没区别
call 一般都发生在,如果你要调的这个方法,你担心没有
比如你的 this.selectComponent == null
此时你只能去找别的类似的对象的方法拿过来用一下
that.selectComponent.call(this)

示例:
let obj = Object.create(null);
obj.a = 1;
Object.prototype.hasOwnProperty.call(obj,"a"); // true
ChanKc
2020-05-30 21:51:13 +08:00
想了想你可能要的是这个
你的 selectComponent 只是临时用一下,比如
let obj = {};
obj.selectComponent = function () { console.log("s") };
obj.selectComponent();
delete obj.selectComponent;

如果是这样,用 call
(function selectComponent () {}).call(obj);

前者可能会覆盖已有的同名方法,而且可能忘记 delete 从而影响 Object.keys 等方法的结果。call 没有那么地“侵入性”
ChanKc
2020-05-30 22:03:54 +08:00
还是说你问的是
func sum(self) {return self.a + self.b };
func sum() { return this.a + this.b };
的区别?我个人喜欢前者
longjiahui
2020-05-31 00:15:56 +08:00
如果不是某个类对象或啥有意义的 this,感觉通过参数传会比较好。
不然 要搞清楚这个 this 会慢慢变得复杂
gromit1337
2020-05-31 12:23:57 +08:00
@ChanKc #6 大概是你这两个的区别,下面的方法用 call 调用
Austaras
2020-05-31 13:35:55 +08:00
这两个都不好, 用 arrow function
pvgjfk
2020-05-31 19:58:16 +08:00
在功能性上没啥区别,都能实现你的目的.
pvgjfk
2020-05-31 20:30:08 +08:00
忘了说了,如果你是我同事你这样写会被我骂的 [狗头]
autoxbc
2020-06-01 06:22:17 +08:00
this 本质上就是隐式传参数,隐式的目的是写起来简洁优雅,不简洁不优雅反而烧脑的用法都是错的,背离了设计初衷
ChanKc
2020-06-01 08:34:35 +08:00
@gromit1337 没啥区别,但是如果是 typescript,涉及到 private 的话,#6 上面那个是不行的
ChanKc
2020-06-01 08:38:06 +08:00
@autoxbc this 不是 js 里最烧脑的东西之一吗
gromit1337
2020-06-01 09:32:05 +08:00
@pvgjfk #11 为什么 /doge
autoxbc
2020-06-01 20:58:29 +08:00
@ChanKc #14
this 没有解决任何重要的问题,只是隐式传参的语法糖。当语法糖吃起来苦时,就是本末倒置了。那些试图用 this 炫技的人,其实不理解这个东西
ChanKc
2020-06-01 22:20:37 +08:00
@autoxbc 没太懂,什么是拿 this 炫技?如果不懂 this 又怎么拿 this 炫技?
pvgjfk
2020-06-03 00:20:40 +08:00
@gromit1337 了解下函数式编程思想就知道了, 既然你能把一个函数设计成纯函数, 那么为什么要多加一个 this 入参使其变为非纯函数呢.
pvgjfk
2020-06-03 00:23:43 +08:00
况且你将 _this 作为参数传入, 这个参数的逻辑和函数内的 this 就已经冗余了, 这么设计函数很明显不合理.
gromit1337
2020-06-03 09:28:05 +08:00
@pvgjfk #19 但是我拿不到调用函数时候的上下文啊 , this.selectComponent()就没法起作用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/676994

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX