Javascript 我可以使用y-combinator获取此闭包的对象引用吗?

Javascript 我可以使用y-combinator获取此闭包的对象引用吗?,javascript,closures,y-combinator,Javascript,Closures,Y Combinator,这项关闭工程: var o = { foo: 5 }; o.handler = function(obj){ return function() { alert(obj.foo); }; }(o); o.handler(); //alert('5') 是否可以使用类似于y-combinator操作的东西来在线定义处理程序 var o = { foo: 5, handler: function(obj){ return

这项关闭工程:

var o = {
    foo: 5
};

o.handler = function(obj){
    return function() {
        alert(obj.foo);
    };
}(o);

o.handler(); //alert('5')
是否可以使用类似于y-combinator操作的东西来在线定义处理程序

var o = {
    foo: 5,
    handler: function(obj){
        return function() {
            alert(obj.foo);
        };
    }(o); //pointer to o? -----------------------------
};
出于学术上的好奇心,我不想在生产代码中这样做


不,这是不可能的,因为在定义对象文字时,变量
o
未定义,并且定义时的
引用未引用
o

如果在外部函数中使用了对
this
的临时引用,并将其传递到闭包中,则该方法会起作用,但无法传递对象以从中获取
foo
属性

var o = {
    foo: 5,
    handler:function(){
        var self = this;
        return function() {
            alert(self.foo);
        };
    }
};

var h = o.handler();
h();

您可以在此处使用
this
关键字:

var o = {
    foo: 5,
    handler: function() {
      alert(this.foo);
    }
};

这是一个简单得多的方法。。。实际上,您的方法甚至不可能,因为当您引用它时,
o
没有定义。

正如其他人所指出的,对于对象文字本身,这是不可能的。但是,该过程可以被包装。它是否“增加了什么”是有争议的。这与Y-Combinator(可能是其中的一半?)不同,因为它并不试图给出一个“递归名称”(据我所知,Y-Combinator假定一级函数和闭包,或者模拟此类函数和闭包的方法)

未经测试,但显示了可以采取的方法。这和
dict
/
res
上的原型链有一些微妙的问题,如果有的话——这是读者的练习

愉快的编码。

但这与
不完全相同,如果在不同的接收器上调用
处理程序
(或者说,作为回调传递),则此
可能会有所不同。
function bindMany (dict, res) {
  res = res || {}
  for (var k in dict) {
    if (dict.hasOwnProperty(k)) {
      var v = dict[p]
      res[k] = v instanceof Function ? v(res) : v
    }
  }
  return res
}

var o = bindMany({
  foo: 5,
  handler: function(obj){
    return function() {
      alert(obj.foo)
    }
  }
})