为了账号安全,请及时绑定邮箱和手机立即绑定

面向对象中嵌套的函数, 关键字 this 怎样处理?

面向对象中嵌套的函数, 关键字 this 怎样处理?

慕虎7371278 2019-04-06 16:57:36
一个不明白的问题.刚开始我学的是用函数式的写法,而且在JS函数嵌套函数是很容易的,这么就搞定了.后来我接触到JS的this,理解每个函数的this指向自身所属对象,接着就开始接触OOP的内容了.但这里有个问题,如果我再对函数进行嵌套,this就可能出错了.比如一个对象的方法里,里边再定义函数用来作为参数传递..或者仅仅是forEach增加一层作用域:obj=people:['a','b',c]data:a:'aaa'b:'aaa'c:'aaa'say:->this.people.forEach(name)->console.logthis.data[name]obj.say()在函数式编程里,没有看到this这样其葩的功能,而在有C/Java一类语言,不常用嵌套函数的.就像两个东西不能很好地兼容似的...但两个都被直接拿过来用在了脚本语言里边有时候会用一个_this来让this穿透函数定义,但我想不是个好办法.不知道有没有好的方案来解决?
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

从forEach这个具体的例子来看,问题倒比较容易解决,毕竟Array.forEach(callback[,thisArg])里可以直接将外层的this传入,这样就解决了。从更一般的角度来看,以我愚见,定义一个varthis_,虽然不太好看,但是在需要多次使用外层的this的时候,还是很方便的。
如果不需要多次使用this的话,Function.bind也可以在一定程度上解决这个问题。想要根本上解决这个问题,也可以考虑在每个构造函数里加入类似这样的代码://methodNames是一个包含所有方法名称的Array
methodNames.forEach(function(name){
this[name]=this[name].bind(this)
},this);缺点是这么做会大大降低运行效率,而且也不好看。总的来说这是Javascript的设计上的问题,只能绕过去了。编辑:(感谢@zx1986的提醒)如果是用CoffeeScript的话,那么可以使用它提供的=>来定义一个保留外层this的函数:classTree
constructor:(@value,@children)->
show:()->
@children.forEach(child)=>
#Notethefatarrow(=>)usedhere
console.log"",@value,child
t=newTree"root",[1,2,3]
t.show()这个功能看起来还是不错的..
                            
查看完整回答
反对 回复 2019-04-06
  • 2 回答
  • 0 关注
  • 264 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信