有必要每次调用函数都fun.bind(this)()吗?
 发布于 9 年前  作者 JerrysShan  7808 次预览  最后一次回复是 9 年前  来自 问答 

最近接手了一个项目,发现项目中调用函数全是这种形式 function importData(){ var _self=this; //… fun1.bind(_self)(a);
fun2.bind(_selft)(b); } 感觉这样是可以避免关键字this带来的问题,但是真的需要每次调用都需要这样吗?

15 回复
nihgwu

ES6 Arrow function 你值得拥有

JerrysShan

@nihgwu 项目用的node 版本较低4.4,而且领导不希望用es6语法

nihgwu

用 ES6写,然后用 Babel 转到 ES5 之后给他看,恶心死他

mosaic101

@nihgwu 哈哈,恶心死领导!

alsotang

代码风格问题吧,那些 func 如果每次都 bind 的话,还不如把 this 作为入参的一个

qinyang912

感觉纯粹是个人喜好问题

dotnil

this 能带来啥问题…… importData 看起来就是个普通方法却有 this 才是真的有问题…… 如果非要这么用,也不需要每次都 bind,要么作为参数传入,要么用 .call 或者 .apply fun1.call(this, a) 就行了

flamingtop

这代码和直接写 this.func1(), this.func2() 并没有两样。问题是写这个代码的人不懂得封装,或者在恐惧和焦灼之中用func1和func2封装了不该封装的东西,更好的方法是封装一个类似 DataImporter 这样的东西 function DataImporter() { return {}; } 然后 new DataImpoter(), 这样内部的this就一致了。

XadillaX

并不喜欢箭头函数的滥用。

ES6 委员会也真是够了。

hyper-god

立即执行的话call,apply值得拥有

(907).toString(32)

DevinXian

代码看着够dry够comfortable就行了,方式不限~

codehz

@xadillax 箭头函数就应该写短的东西,或者一个表达式能表达的东西

来自酷炫的 CNodeMD

vincentLiuxiang

做个benchmark,测下吧;

function importData(){
   var _self=this;
	//…
  fun1.bind(_self)(a); // fun1.call(_self,a);
  fun2.bind(_selft)(b); // fun2.call(_self,b);
}

vs

function importData(){
  fun1(this,a); 
  fun2(this,b);
}

测完之后就知道用哪个了!

Chunlin-Li

一说起OO面向对象, 感觉没有人不知道, 可是却很少见到有人真的能在 js 中用对。 楼主的问题, 搞定不了的话试试用OO风格来解决吧。 另外, 用 Event 也是个办法。

XadillaX

@codehz 正解,所以我强调了“滥用”