一个不明白的问题. 刚开始我学的是用函数式的写法, 而且在 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.log this.data[name]
obj.say()
在函数式编程里, 没有看到 this 这样其葩的功能, 而在有 C/Java 一类语言, 不常用嵌套函数的.
就像两个东西不能很好地兼容似的... 但两个都被直接拿过来用在了脚本语言里边
有时候会用一个 _this 来让 this 穿透函数定义, 但我想不是个好办法.
不知道有没有好的方案来解决?
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
从
forEach这个具体的例子来看,问题倒比较容易解决,毕竟里可以直接将外层的
this传入,这样就解决了。从更一般的角度来看,以我愚见,定义一个
var this_,虽然不太好看,但是在需要多次使用外层的this的时候,还是很方便的。如果不需要多次使用
this的话,Function.bind也可以在一定程度上解决这个问题。想要根本上解决这个问题,也可以考虑在每个构造函数里加入类似这样的代码:
// methodNames是一个包含所有方法名称的Array methodNames.forEach(function(name) { this[name] = this[name].bind(this) }, this);缺点是这么做会大大降低运行效率,而且也不好看。
总的来说这是
Javascript的设计上的问题,只能绕过去了。编辑:(感谢@zx1986的提醒)如果是用CoffeeScript的话,那么可以使用它提供的
=>来定义一个保留外层this的函数:class Tree constructor: (@value, @children) -> show: () -> @children.forEach (child) => # Note the fat arrow (=>) used here console.log "<Tree %s %s>", @value, child t = new Tree "root", [1, 2, 3] t.show()这个功能看起来还是不错的..