JavaScript Ruby 的代码块和 Javascript 的回调函数有哪些共性与区别?

gaicitadie · 2012年04月26日 · 最后由 aNdReW_Qx 回复于 2012年04月26日 · 4094 次阅读

用 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~ 非常透彻

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册