用 jquery 的时候经常这样写:
obj.click(functuion(){ //do something...... });
$.ajax({ url: 'xxx', success: function(str){ //do something...... } });
跟 ruby 的代码块感觉很像,不需要给一段代码取函数名,也可以向里面传递参数。那么这两者有什么区别呢?ruby 还需不需要回调函数这个概念?
问题出在 self 和 this 上,javascript 里函数可是一类公民,this 是自己,不是回调的类,而 ruby 的块可不是一类公民。
也就是说 jquery 可以这样对不:
obj.click(functuion(){ var $this = $(this); //do something...... });
那么 ruby 有没有回调函数呢
在 JavaScript 里面,函数 (Function) 也是一个对象 (Object),函数对象可以以匿名函数的形式作为一个字面量而存在,所以函数既可以是右值也可以是另一个函数的参数。 比如以下都是允许也是推荐的:
// 推荐的函数声明方式 var fn = function() { return 'hello world!'; } // 把fn传给匿名函数并执行 (function (callback) { console.log((callback || null) && callback()); })(fn)
目前非 ruby 开发者....对 ruby 还不了解
还有 return 的问题,ruby 支持 non-local-return
js 里边,函数本身作为对象,可以这样指定函数的调用环境
var func = function(){...}; ... func.apply(context,args...);
ruby 里类似的大概只有 instance_eval class_eval 这类函数了,不过也不等效
#5 楼 @aNdReW_Qx Ruby 中的 UnboundMethod 可以指定调用的对象。与之类似。
class A def hello p "#{self}:hello" end end hello_method = A.instance_method(:hello) hello_method.bind(A.new).call # -> "#<A:0x1e4d298>:hello" hello_method.bind(A.new).call # -> "#<A:0x1ec5e50>:hello" hello_method.bind(A.new).call # -> "#<A:0x1f095c0>:hello"
bind 方法返回了一个 Method 对象。
上例的 hello_method 只能绑定 A 的实例。下面可以绑定任何对象。
def hello p "#{self}:hello" end um_hello = method(:hello).unbind um_hello.bind("ruby").call um_hello.bind(1234).call um_hello.bind(Object).call
这样例子是画蛇添足。实际上直接"ruby".send(:hello) 调用即可。这个例子只是来模拟可以动态绑定某个对象然后进行调用而已。
#7 楼 @skandhas nice~ 非常透彻