小程序里的一个封装方法需要调用页面的组件, 要用到 this.selectComponent().doThing() ,这里引起了标题的争议了
|
1
感觉用 call 少了个参数,少了些思想负担😂,但是我的后端同事们好像对 es2015 之后的语法都很排斥
|
|
liuy1994gMay 30, 2020
2
this 和参数还是有些区别的吧
|
|
rabbbitMay 30, 2020
3
面向对象编程和函数式编程?
|
|
ChanKcMay 30, 2020
4
没有太看懂
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 |
|
ChanKcMay 30, 2020
5
想了想你可能要的是这个
你的 selectComponent 只是临时用一下,比如 let obj = {}; obj.selectComponent = function () { console.log("s") }; obj.selectComponent(); delete obj.selectComponent; 如果是这样,用 call (function selectComponent () {}).call(obj); 前者可能会覆盖已有的同名方法,而且可能忘记 delete 从而影响 Object.keys 等方法的结果。call 没有那么地“侵入性” |
|
ChanKcMay 30, 2020
6
还是说你问的是
func sum(self) {return self.a + self.b }; func sum() { return this.a + this.b }; 的区别?我个人喜欢前者 |
|
longjiahuiMay 31, 2020
7
如果不是某个类对象或啥有意义的 this,感觉通过参数传会比较好。
不然 要搞清楚这个 this 会慢慢变得复杂 |
|
8
@ChanKc #6 大概是你这两个的区别,下面的方法用 call 调用
|
|
9
这两个都不好, 用 arrow function
|
|
pvgjfkMay 31, 2020
10
在功能性上没啥区别,都能实现你的目的.
|
|
pvgjfkMay 31, 2020
11
忘了说了,如果你是我同事你这样写会被我骂的 [狗头]
|
|
autoxbcJun 1, 2020
12
this 本质上就是隐式传参数,隐式的目的是写起来简洁优雅,不简洁不优雅反而烧脑的用法都是错的,背离了设计初衷
|
|
ChanKcJun 1, 2020 via Android
13
@gromit1337 没啥区别,但是如果是 typescript,涉及到 private 的话,#6 上面那个是不行的
|
|
15
@pvgjfk #11 为什么 /doge
|
|
autoxbcJun 1, 2020
16
@ChanKc #14
this 没有解决任何重要的问题,只是隐式传参的语法糖。当语法糖吃起来苦时,就是本末倒置了。那些试图用 this 炫技的人,其实不理解这个东西 |
|
pvgjfkJun 3, 2020
18
@gromit1337 了解下函数式编程思想就知道了, 既然你能把一个函数设计成纯函数, 那么为什么要多加一个 this 入参使其变为非纯函数呢.
|
|
pvgjfkJun 3, 2020
19
况且你将 _this 作为参数传入, 这个参数的逻辑和函数内的 this 就已经冗余了, 这么设计函数很明显不合理.
|
|
20
@pvgjfk #19 但是我拿不到调用函数时候的上下文啊 , this.selectComponent()就没法起作用
|
|
ChanKcJun 5, 2020
21
@gromit1337 如果类似于#6 的案例
我看 Cay S. Horstman 提出的 golden rule 说 Don’t use this outside constructors or methods. 也就是不要在类以外的地方使用 this Douglas Crockford 的做法更极端,他完全不用 this 。 我觉得普通的函数,不是属于特定类或者具有特定“shape”的对象的方法的函数就最好不要出现 this |