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

一个不明白的问题.刚开始我学的是用函数式的写法,而且在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穿透函数定义,但我想不是个好办法.
不知道有没有好的方案来解决?
有只小跳蛙
浏览 304回答 2
2回答

慕码人2483693

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

相关分类

JavaScript