一个不明白的问题.刚开始我学的是用函数式的写法,而且在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是一个包含所有方法名称的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,child t=newTree"root",[1,2,3]t.show()这个功能看起来还是不错的..
添加回答
举报
0/150
提交
取消