在javascript闭包中,'this'引用实际调用函数的对象。
ruby Proc / lambda也有“这个”功能吗?
如果没有,如果我想在红宝石中使用'this',我该怎么办?除了通过参数将当前对象传递给Proc / lambda。
答案 0 :(得分:2)
如果在Ruby对象中初始化lambda或proc,则可以使用self
。例如:
class Example
def name
"Example"
end
def test
lambda{ puts self.name}.call
end
end
example = Example.new
example.test # "Example"
有关Ruby self
的更详细说明,请参阅:http://sidtalk.wordpress.com/2008/10/06/what-exactly-is-ruby-self/。
答案 1 :(得分:2)
this
一般不是函数或闭包概念的一部分。函数只是你可以用参数调用的东西; “当前对象”与它有什么关系? JavaScript中所有函数中都存在this
来自方法在该语言中工作的特殊方式。
在JavaScript中,所有函数都有this
的概念,因为在JavaScript中,方法和函数之间没有分离。任何函数都可以用作方法;您可以通过将函数指定为对象的属性来向对象添加方法。此外,在JavaScript中,函数没有当前对象的显式参数(与Python不同);那么方法如何访问其对象?当您运行方法调用表达式时,它会将您调用它的对象作为隐式this
参数传递给该函数。但是,如果使用该属性获取函数并像其他任何函数一样手动调用它,this
将成为全局对象(或者在严格模式下,未定义)。
换句话说,在JavaScript中,当你通过属性从一个对象中获取一个方法时,它是一个“未绑定的方法” - 它不知道它来自哪个对象;相反,当你将一个函数作为一个方法按属性放入一个对象时,该函数不需要知道要开始的对象 - 该对象将在调用它时通过方法调用语法神奇地传递给它。您还可以使用函数上的this
或.call()
方法人为地为函数提供.apply()
参数(obj.foo(x)
相当于obj.foo.call(obj, x)
)。< / p>
在Ruby中,方法和匿名函数之间存在完全分离。使用lambda
,proc
或Proc.new
等创建的匿名函数是数据,可以存储在变量中。使用与方法不同的语法(call
或[]
)调用它们。方法是使用def
定义的,你不能通过简单地写出它的名字(它会调用它)来获取数据。可以使用对象上的method
方法从对象中获取方法,给出方法名称,并返回Method
对象。您可以使用Method
对象,例如Proc
对象,例如你可以打电话给call
;您甚至可以使用Proc
将其转换为to_proc
。与JavaScript不同,绑定方法(类Method
)和未绑定方法(类UnboundMethod
)之间存在区别。当你从一个对象中获取一个方法时,它就被绑定了 - 它知道它的对象;如果需要,你可以解除绑定并将其绑定到另一个对象。
此外,在Ruby中,您不能只使用Proc
并将其附加到对象并使其成为方法,因为方法具有无效的语法(例如@some_var
) Proc
。要向对象添加方法,可以使用instance_exec
并将方法定义(def
)放入块中。
简而言之,闭包中this
的概念处理了大多数语言中都没有的JavaScript中的独特情况。特别是,Ruby中没有出现这个问题,因为Ruby的对象方法是绑定方法,也不能随意插入闭包作为方法。
P.S。其他人已经评论了从闭包中定义闭包的self
。但是,这根本不是JavaScript中的this
。